PowerShell将文件夹重命名为小写,特殊字符名称场景现有方案失效如何解决
解决方案
问题根因
代码运行失效的核心原因是PowerShell中Rename-Item的默认-Path参数支持通配符解析,[]属于PowerShell内置通配符语法,当文件夹名包含方括号时,-Path会把方括号内容解析为通配符匹配规则,无法定位到实际的目标文件夹。
修正方案
将所有路径传递改为使用-LiteralPath参数,该参数不会解析任何通配符,会原样识别路径中的所有特殊字符。同时递归场景下需要先处理深层子文件夹,再处理上层父文件夹,避免上层改名后下层路径失效。
非递归版本(仅处理当前目录下的文件夹)
Get-ChildItem -Directory -LiteralPath . | ForEach-Object { $NName = $_.Name.ToLowerInvariant() $TempItem = Rename-Item -LiteralPath $_.FullName -NewName "x$NName" -PassThru Rename-Item -LiteralPath $TempItem.FullName -NewName $NName }
递归版本(处理当前目录及所有子层级文件夹)
# 递归获取所有包含大写字母的文件夹,按路径倒序保证先改深层目录 Get-ChildItem -Recurse -Directory -LiteralPath . | Where-Object { $_.Name -CMatch "[A-Z]" } | Sort-Object FullName -Descending | ForEach-Object { $NName = $_.Name.ToLowerInvariant() $TempItem = Rename-Item -LiteralPath $_.FullName -NewName "x$NName" -PassThru Rename-Item -LiteralPath $TempItem.FullName -NewName $NName }
注意事项
- 正式执行前可以在
Rename-Item末尾添加-WhatIf参数,仅输出模拟改名结果,确认逻辑符合预期后再移除-WhatIf实际执行 - 临时命名前缀
x不会和原名称的特殊字符产生冲突,-LiteralPath会原样处理所有字符
内容的提问来源于stack exchange,提问作者Lhakryma DL
相关产品推荐
相关产品推荐

