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

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

在批处理文件中,我遍历文件中的 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
)

我如何获取当前目录?

答案1

%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
)

中的变量扩展cmd有点违反直觉%foo%。当%date%语句%cd%解析,而不是在执行时。像docount 后面的块一样,块作为单个语句,因此块中的每个变量都将被其值替换循环for甚至会运行。这意味着%CD%被它原来的值替换循环。不出所料,这就是价值pushd

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

奖金测验: 为什么 %DestinationDirectory% 还能按预期工作吗?

相关内容