PowerShell路径含[时cd、Get-ChildItem报错的解决方案问询
问题原因
PowerShell 5.1及更早版本中,方括号[]是内置的通配符标记,语法规则为[字符集]用于匹配集合内的任意单个字符,和*(匹配任意长度字符)、?(匹配单个任意字符)属于同类特殊语法字符。
当你直接给cd、Get-ChildItem等命令传入带[的路径且不显式指定参数时,命令会默认把值绑定到支持通配符解析的-Path参数,将[识别为通配符语法的起始标记而非普通路径字符,最终出现路径不存在、通配符模式无效的报错。单独的]不会触发问题,是因为没有匹配的起始[时,PowerShell会把它当成普通字符处理。
解决方法
以下方法均适配PowerShell 5.1版本,不需要切换到CMD或依赖短文件名:
- 优先使用
-LiteralPath参数(最推荐)
所有涉及路径操作的PowerShell原生cmdlet都内置-LiteralPath参数,该参数会将传入的路径完全按字面文本解析,不会识别任何通配符,是处理带特殊字符路径最稳定的方案。注意cd、dir这类别名默认绑定的是-Path参数,必须显式写出-LiteralPath参数名才能生效:
# 切换目录 Set-Location -LiteralPath "McNab [A1]" cd -LiteralPath "[" # 访问名称为单个[的文件夹也正常 # 列目录内容 Get-ChildItem -LiteralPath "McNab [A1]" dir -LiteralPath "McNab [A1]" # 计算文件哈希(Get-FileHash同样支持该参数) Get-FileHash -LiteralPath "McNab [A1]\target_file.pdf"
- 转义特殊字符
如果需要保留通配符匹配能力(比如路径里一部分要精确匹配带[]的名称,另一部分要用*做模糊匹配),可以用PowerShell转义符反引号(`,键盘上数字1左边的按键)对[做转义,把路径里的[替换为`[即可:
# 转义后用默认-Path参数也能正常识别 cd "McNab `[A1]" dir "McNab `[A1]"
如果路径是动态生成的、不是手动输入的,可以调用内置方法自动完成所有通配符的转义,不需要手动替换:
$rawPath = "McNab [A1]" $escapedPath = [WildcardPattern]::Escape($rawPath) dir $escapedPath # 直接使用转义后的路径即可
- Tab自动补全
手动输入路径前缀(比如输入cd McNab)后按下Tab键,PowerShell自动补全对应文件夹路径时,会自动给[这类特殊字符加上正确的转义符,直接执行补全后的命令就可以正常访问,不需要手动处理转义。
你之前使用8.3短文件名绕过的方案可以生效,但操作成本高,批量处理带[]的文件夹时效率很低,优先使用上面三种原生方案即可。
内容的提问来源于stack exchange,提问作者Bancam
相关产品推荐
相关产品推荐

