我设置了一个环境变量,其中包含几个以逗号分隔的目录路径,并使用 FOR 循环将当前目录设置为变量中的下一个目录路径。我试图获得当前的路径,但结果看起来很奇怪。
我尝试使用以下代码:
set a=C:\test\A,C:\test\B,C:\test\C
for %%i in (%a%) do (
echo %%i
echo 1 %CD%
cd %%i
echo 2 %CD%
echo ""
)
结果是:
C:\test>TEST.BAT
C:\test\A
1 C:\test
2 C:\test
""
C:\test\B
1 C:\test
2 C:\test
""
C:\test\C
1 C:\test
2 C:\test
""
C:\test\C>
%CD%
之后应更改 cd %%i
。但是所有echo %CD%
输出批处理文件路径C:\test
是启动批处理文件时的当前目录。
如何获得正确的当前路径?
答案 0 :(得分:1)
在命令块中以%variable%
开头并以匹配(
开头的所有环境变量引用都被Windows命令解释器替换为命令之前引用的环境变量的当前值分别执行命令块命令左开始命令块。
这意味着对于发布的批处理文件中的 FOR 循环,Windows命令解释程序会在预处理状态下将代码修改为:
)
在命令提示符窗口中运行批处理文件时,可以看到与发布完全相同的输出,而不是双击批处理文件,顶部的for %i in (C:\test\A C:\test\B C:\test\C) do (
echo %i
echo 1 C:\test
cd %i
echo 2 C:\test
echo ""
)
已删除或已注释掉或修改为@echo off
。
请注意目录列表中的空格替换每个逗号,@echo on
替换为%CD%
和修改后的缩进。
然后使用此预处理的命令块执行 FOR 命令。
批处理文件中的命令C:\test
有效,但环境变量引用在执行之前已被变量cd %%i
的当前值CD
替换。
在执行 FOR 循环期间,需要延迟环境变量扩展才能查看当前目录。
C:\test
但请注意,目录/文件名中的感叹号被解释为启用延迟环境变量扩展作为变量引用的开始/结束,这可能导致执行时出现意外行为。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
@echo off
setlocal EnableDelayedExpansion
set "DirectoryList=C:\test\A C:\test\B C:\test\C"
for %%I in (%DirectoryList%) do (
echo %%I
echo 1 !CD!
cd /D %%I
echo 2 !CD!
echo/
)
rem Other commands in batch file perhaps using DirectoryList.
endlocal
cd /?
echo /?
endlocal /?
for /?
rem /?
...还解释了 IF 和 FOR 示例的延迟环境变量扩展。set /?
另见文章:
setlocal /?
代替echo/
(或echo.
)输出空行。