PowerShell中cd无法处理含[]的路径,如何转义变量使其生效?
解决PowerShell中路径含[]时cd命令失效的问题
问题原因
PowerShell里的cd是Set-Location的别名,它默认会将路径中的[]视为通配符(用于匹配字符集合);而mkdir(New-Item)、rm这类命令处理路径时,默认不会解析这些通配符字符,这就造成了行为不一致的现象。
解决方案
以下几种方法均可解决该问题:
方法一:使用Set-Location的-LiteralPath参数
直接调用完整的Set-Location cmdlet并指定-LiteralPath参数,该参数会完全按字面量解析路径,不处理任何通配符:
Set-Location -LiteralPath $tmp_dir
方法二:手动转义通配符字符
用PowerShell的[WildcardPattern]::Escape()方法自动转义路径中的通配符(包括[]):
$escapedDir = [WildcardPattern]::Escape($tmp_dir) cd $escapedDir
方法三:通过.NET API切换目录
直接调用.NET类库设置当前工作目录,绕开PowerShell的通配符解析逻辑:
[Environment]::CurrentDirectory = (Resolve-Path $tmp_dir).Path
优化后的示例代码
推荐使用Join-Path拼接路径(比字符串拼接更可靠),结合-LiteralPath的完整示例:
$files = @("[som]video.mkv") $tmp_location = "." foreach ($file in $files){ $base_input = ([io.fileinfo]$file).basename $tmp_dir = Join-Path -Path $tmp_location -ChildPath $base_input mkdir $tmp_dir # 切换到目标目录 Set-Location -LiteralPath $tmp_dir # 执行你的数据处理操作... # 操作完成后切回初始目录 Set-Location -LiteralPath $tmp_location }
如果需要临时切换目录处理,更推荐用Push-Location和Pop-Location组合,无需手动切回:
foreach ($file in $files){ # ... 省略前面的路径生成代码 mkdir $tmp_dir Push-Location -LiteralPath $tmp_dir # 执行操作 Pop-Location # 自动回到之前的目录 }
内容的提问来源于stack exchange,提问作者user206904
相关产品推荐
相关产品推荐

