在批处理文件中,我遍历文件中的 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)
如何获取当前目录?
%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 enabledelayedexpansion或cmd具有与启动cmd /v:on,或者在注册表中启用。最安全的方法是第一种,因为它不依赖于任何外部配置或环境。
奖金测验: 为什么 %DestinationDirectory% 仍然按预期工作?
| 归档时间: |
|
| 查看次数: |
4059 次 |
| 最近记录: |