在批处理文件中,我遍历文件中的 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%
解析,而不是在执行时。像do
count 后面的块一样,块作为单个语句,因此块中的每个变量都将被其值替换前循环for
甚至会运行。这意味着%CD%
被它原来的值替换前循环。不出所料,这就是价值前这pushd
。
延迟扩展通过在语句之前扩展变量来解决这个问题执行!foo!
。不过,他们需要使用表格和它必须通过 明确激活setlocal enabledelayedexpansion
或cmd
启动,cmd /v:on
或者必须在注册表中启用。最安全的方法是第一种方法,因为它不依赖于任何外部配置或环境。
奖金测验: 为什么 %DestinationDirectory%
还能按预期工作吗?