You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:05:51