如何用PowerShell批量将父目录下所有文件和目录的下划线替换为空格?
用PowerShell批量替换目录和文件名中的下划线为空格
需求:将目标父目录下所有子目录及文件名称中的下划线替换为空格,包含各级嵌套的目录与文件。
示例
当前状态
folder_1 -- file_1.mp4 -- file_1.srt -- file_1.vtt folder_2 -- file_2.mp4 -- file_2.srt -- file_2.vtt folder_3 -- file_3.mp4 -- file_3.srt file_3.vtt
期望状态
folder 1 -- file 1.mp4 -- file 1.srt -- file 1.vtt folder 2 -- file 2.mp4 -- file 2.srt -- file 2.vtt folder 3 -- file 3.mp4 -- file 3.srt -- file 3.vtt
你尝试的命令(仅部分生效)
get-childitem *.* | foreach { rename-item $_ $_.Name.Replace("_", " ") } get-childitem -recurse | foreach { rename-item $_ $_.name.replace("_"," ") }
最优解决方案
你的命令失效原因是:递归重命名时如果先修改父目录,后续子项的原始路径会失效,导致系统找不到文件。正确逻辑是先处理最深层的子项,再逐层向上处理父目录。
使用以下命令可高效完成需求:
Get-ChildItem -Recurse | Sort-Object -Property FullName -Descending | ForEach-Object { $newName = $_.Name.Replace("_", " ") if ($newName -ne $_.Name) { Rename-Item -Path $_.FullName -NewName $newName -Force } }
命令说明
Get-ChildItem -Recurse:遍历当前目录下所有文件和子目录(含嵌套层级)Sort-Object -Property FullName -Descending:按完整路径降序排序,确保先处理最深层子项,避免父目录改名后子项路径失效$_.Name.Replace("_", " "):将当前项名称中的下划线替换为空格if ($newName -ne $_.Name):跳过无需修改的项,提升执行效率-Force:确保重命名可覆盖隐藏文件等特殊情况
如果需要指定目标父目录,只需在Get-ChildItem后添加路径:
Get-ChildItem "C:\你的目标父目录路径" -Recurse | Sort-Object -Property FullName -Descending | ForEach-Object { $newName = $_.Name.Replace("_", " ") if ($newName -ne $_.Name) { Rename-Item -Path $_.FullName -NewName $newName -Force } }
内容的提问来源于stack exchange,提问作者Vidkin
相关产品推荐
相关产品推荐

