PowerShell Get-ChildItem无法识别含[]的文件,重命名报错
解决PowerShell重命名含[]文件名失败的问题
问题场景
我使用以下PowerShell代码,为C:\Users\Documents\SAMPLE目录及其子目录下的.mp4、.mkv文件批量添加(TEST)标识:
gci C:\Users\Documents\SAMPLE\* -in *.mp4,*.mkv -Recurse | % { rename-item –path $_.Fullname –Newname ( $_.basename + ' (TEST)' + $_.extension) }
代码对普通文件名有效,但处理含[]的文件时会报错:
Cannot rename because item at 'C:\Users\Documents\SAMPLE\AAAAAAAAA[B].mp4' does not exist
问题原因
PowerShell中[]属于通配符(用于匹配括号内任意单个字符),当使用-Path参数传入含[]的路径时,PowerShell会将其解析为通配符表达式,而非实际的字面路径,因此无法定位到目标文件。
解决方案
最简便可靠的方法是使用-LiteralPath参数替代-Path,该参数会将传入的路径作为字面量处理,不解析任何通配符:
Get-ChildItem C:\Users\Documents\SAMPLE\* -Include *.mp4,*.mkv -Recurse | ForEach-Object { Rename-Item -LiteralPath $_.FullName -NewName ($_.BaseName + ' (TEST)' + $_.Extension) }
注:代码中把缩写的gci(Get-ChildItem)、%(ForEach-Object)展开为全称以提升可读性,你也可以保留缩写版本,功能不受影响。
内容的提问来源于stack exchange,提问作者arsaces
相关产品推荐
相关产品推荐

