为什么在使用 pushd 到 UNC 路径后 %CD% 不起作用?

JJS*_*JJS 4 windows batch

在批处理文件中,我遍历文件中的 unc 路径列表,使用 pushd 将上下文更改为该位置,然后执行命令。%CD% 给出了上一个目录的位置,而不是当前推送的目录。

for /f "tokens=*" %%A in (filesharelist.txt) do (
 pushd %%A
 echo CD=%CD% - expecting x:\ or x:\subpath here, but get previous directory
 REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
 popd
)
Run Code Online (Sandbox Code Playgroud)

如何获取当前目录?

Joe*_*oey 7

%CD%像它应该的那样工作。你的问题是它你的for循环运行之前就被扩展了。改用延迟扩展:

setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (filesharelist.txt) do (
 pushd %%A
 echo CD=!CD!
 REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
 popd
)
Run Code Online (Sandbox Code Playgroud)

变量扩展cmd有点违反直觉。正常的环境变量(%foo%形式,包括伪变量,如%date%, %cd%, ...)在解析语句时展开,而不是在执行时展开。块像一个继do所以块中每个变量是由它的价值取代算作一个单独的语句之前for循环甚至可以运行。这意味着%CD%被循环之前的值替换。不出所料,这是价值之前pushd

延迟扩展通过在执行语句之前扩展变量来解决这个问题。他们需要使用!foo!的这种形式,虽然它与显式激活setlocal enabledelayedexpansioncmd具有与启动cmd /v:on,或者在注册表中启用。最安全的方法是第一种,因为它不依赖于任何外部配置或环境。

奖金测验: 为什么 %DestinationDirectory% 仍然按预期工作?