批处理脚本中“CD /D !var!”不起作用

批处理脚本中“CD /D !var!”不起作用

我想要的是:

cd !pathname!

这应该将目录更改为路径。当然,在其他驱动器上,如果没有 ,则此操作无法在一行中完成cd /D !pathname!

我的测试/调试代码如下:

cls
set @InDrive=%~d0

echo /D K:\
echo /D !@InDrive!\
echo !@InDrive!\

cd /D K:\
cd /D !@InDrive!\
!@InDrive!\
cd /D K:\

@此线路必须有此标志set @InDrive=%~d0\

如果没有它,变量根本就不会被设置。

我的代码结果如下:

/D K:\
/D K:\
K:\
Der Befehl "K:\" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

语法错误来自以下行!@InDrive!

但是当我回显该行并按原样复制该行的输出时,它会更改目录。奇怪的是,手动输入精确的输出是可行的,但在批处理脚本中却行不通。发生了什么事?顺便说一句:我!@InDrive!在同一个 cmd.exe 窗口中运行了脚本和位于变量中的命令。所以后台什么都没有改变。(记住:当手动编写时,!@InDrive!equalsK:\应该可以正常工作)cd /D K:\

这是怎么回事?这是最近 Windows 10 更新中出现的数百个错误之一吗?

我可以发誓,几年前我使用过类似的命令,并且成功了。但我不再有脚本了。

不幸的是,搜索没有得到任何结果。有人知道错误的原因吗?目标是编写一个使用相对路径的脚本,所以我需要一张可用的 CD。(我将使用set @InPath=%~dp0input\,使用 时它会按预期回显echo !@InPath!

我也试过了pushd,手写也可以,但批处理脚本不行。所以很遗憾这不是答案。

重要编辑:

当我禁用它时,SETLOCAL EnableDelayedExpansion它可以工作!但我绝对需要使用SETLOCAL EnableDelayedExpansion

有什么干净的解决方法吗?当我在循环之前进行 CD 时SETLOCAL EnableDelayedExpansion,它可以工作,但我想在循环内进行 CD。

答案1

答案很简单,但也很复杂。 SETLOCAL EnableDelayedExpansion基本上会“Setlocal”任何事物。这意味着它不再将 CD 转发给 CMD.exe。只有ENDLOCAL这样才有效。但是它不能在循环内使用。

代码必须重写为CD之前SETLOCAL EnableDelayedExpansion或之后ENDLOCAL这个话题很好地回答了为什么存在这个问题。

相关内容