我想要的是:
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
。
这个话题很好地回答了为什么存在这个问题。