我用几个逗号分隔的目录路径设置环境变量,并使用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
,它是启动批处理文件时的当前目录。如何获得正确的电流路径?
最佳答案
Windows命令解释器将在命令块中以%variable%
开头并以匹配的(
结尾的所有环境变量引用替换为Windows命令解释器,该引用由环境变量的当前值分别在命令块之前移至命令开始左的命令之前块完全执行。
这意味着Windows命令解释器会在预处理状态下将发布的批处理文件中的FOR循环修改为:
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循环期间,需要延迟的环境变量扩展才能查看当前目录。
@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
但是请注意,将目录/文件名中的感叹号解释为启用延迟的环境变量扩展作为变量引用的开始/结束,这可能会导致执行意外行为。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
C:\test
cd /?
echo /?
endlocal /?
for /?
rem /?
...还解释了在IF和FOR实例上延迟的环境变量扩展。set /?
另请参阅文章:
How to set environment variables with spaces?
This answer有关命令SETLOCAL和ENDLOCAL的详细信息。
DosTips论坛主题ECHO. FAILS to give text or blank line - Instead use ECHO/为什么最好使用
setlocal /?
代替echo/
(或echo.
)来输出空行。
关于batch-file - 如何在FOR循环中批量获取有关当前路径%CD%的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46578963/