PowerShell批量重命名子文件夹中非TXT文件问题求助
解决方案
核心思路
遍历每个包含目标文件的子文件夹,先提取该文件夹内TXT文件的基名(作为新文件名的核心),再找到同目录下的非TXT文件,将其重命名为「TXT基名 + 原非TXT文件的扩展名」。
实现代码
# 递归遍历所有子文件夹 Get-ChildItem -Directory -Recurse | ForEach-Object { # 获取当前文件夹里的TXT文件 $txtFile = Get-ChildItem -Path $_.FullName -File -Filter "*.txt" if ($txtFile) { # 找到当前文件夹里的非TXT文件 $nonTxtFile = Get-ChildItem -Path $_.FullName -File | Where-Object { $_.Extension -ne ".txt" } if ($nonTxtFile) { # 拼接新文件名:TXT文件的基名 + 原非TXT文件的扩展名 $newFileName = "$($txtFile.BaseName)$($nonTxtFile.Extension)" $newFilePath = Join-Path -Path $_.FullName -ChildPath $newFileName # 执行重命名,-WhatIf用于预览效果,确认无误后可删除该参数 Rename-Item -Path $nonTxtFile.FullName -NewName $newFilePath -WhatIf } } }
关键说明
- 保留
-WhatIf参数时,只会输出将要执行的重命名操作,不会实际修改文件,建议先预览确认逻辑正确再移除该参数。 - 代码会自动跳过没有TXT文件或非TXT文件的文件夹,避免无意义的报错。
- 确保每个子文件夹里只有一对目标文件(1个TXT + 1个非TXT),如果有多个非TXT文件,需要额外添加过滤逻辑。
可选:重命名同时移动到父目录
如果需要把重命名后的非TXT文件转移到父目录,只需修改新文件的路径指向父目录即可:
Get-ChildItem -Directory -Recurse | ForEach-Object { $txtFile = Get-ChildItem -Path $_.FullName -File -Filter "*.txt" if ($txtFile) { $nonTxtFile = Get-ChildItem -Path $_.FullName -File | Where-Object { $_.Extension -ne ".txt" } if ($nonTxtFile) { # 获取当前文件夹的父目录路径 $parentDir = $_.Parent.FullName $newFileName = "$($txtFile.BaseName)$($nonTxtFile.Extension)" $newFilePath = Join-Path -Path $parentDir -ChildPath $newFileName Rename-Item -Path $nonTxtFile.FullName -NewName $newFilePath -WhatIf } } }
原有命令失败原因
你之前的命令Rename-Item -NewName {$_.extension -eq ".txt"}逻辑错误:脚本块内的$_.extension -eq ".txt"是布尔判断(非TXT文件的扩展名肯定不等于.txt,所以返回False),因此所有非TXT文件都会被重命名为False,自然会出现文件名重复的报错。
内容的提问来源于stack exchange,提问作者RandomPowershell
相关产品推荐
相关产品推荐

