关于PowerShell批量替换含子文件夹的文件/文件夹名称中指定字符的问题咨询
关于PowerShell批量替换含子文件夹的文件/文件夹名称中指定字符的问题咨询
嗨,我看你正在折腾用PowerShell批量处理近10000个文件(包括多级子文件夹里的),要把文件名里的#替换成(hash)对吧?先给你理理当前的情况和可以优化的地方:
首先你的需求很明确:
- 目标路径:
C:\Users\JHB Laptop\Documents\test,包含多级子文件夹(比如New folder1\New folder2\...\New folder5) - 操作:把所有文件、文件夹名称中的
#替换为(hash)
你现在用的这段代码:
cd "C:\Users\JHB Laptop\Documents\test" # by default, -replace is case-insensitive (equivalent to -ireplace) # for case-sensitive, use -creplace Dir | Rename-Item –NewName { $_.name –replace "#","(hash)" }
确实能工作,但有个小局限——默认的Dir(也就是Get-ChildItem)只会遍历当前目录下的文件和文件夹,不会深入到子文件夹里去。如果你要处理所有层级的内容,得加上-Recurse参数。
给你调整后的代码,更适合你的需求:
# 切换到目标目录 Set-Location "C:\Users\JHB Laptop\Documents\test" # 递归遍历所有文件和文件夹,模拟替换名称中的#为(hash) Get-ChildItem -Recurse | Rename-Item –NewName { $_.Name –replace "#","(hash)" } -WhatIf
这里特意加了-WhatIf参数,它会帮你模拟所有重命名操作,不会实际修改文件名。你可以先运行这段代码,看看输出的修改项是不是符合你的预期,确认没问题后,再把-WhatIf去掉,执行实际的重命名操作。
另外还有几个小提醒:
- 如果遇到权限不足或者文件被占用的情况,重命名可能会失败,你可以考虑加上
-ErrorAction SilentlyContinue来忽略错误,但建议先排查具体的失败原因,避免遗漏重要文件 -replace是基于正则表达式的,好在#不是正则特殊字符,所以直接用就行;如果以后要替换.、*这类特殊字符,记得用反斜杠转义,比如\-replace "\.", "dot"
备注:内容来源于stack exchange,提问作者lwaxg10
相关产品推荐
相关产品推荐

