Batch file 如何在FOR循环中获取批处理中当前路径%CD%的信息?
我用几个逗号分隔的目录路径设置了一个环境变量,并使用FOR循环将当前目录设置为变量中的下一个目录路径。我试图得到当前路径,但结果看起来很奇怪 我尝试使用以下代码:Batch file 如何在FOR循环中获取批处理中当前路径%CD%的信息?,batch-file,Batch File,我用几个逗号分隔的目录路径设置了一个环境变量,并使用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
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
是启动批处理文件时的当前目录
如何获得正确的当前路径?在命令块中使用
%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%
替换为C:\test
和修改的缩进
然后使用此预处理的命令块执行FOR命令
批处理文件中的命令cd%%i
起作用,但环境变量引用在执行前已被变量cd
的当前值替换,该值位于此处C:\test
在执行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
但请注意,目录/文件名中的感叹号被解释为启用了延迟环境变量扩展作为变量引用的开始/结束,这可能导致执行时出现意外行为
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
cd/?
echo/?
endlocal/?
获取/?
rem/?
。。。还解释了IF和FOR示例上的延迟环境变量扩展设置/?
setlocal/?
- 有关命令SETLOCAL和ENDLOCAL的详细信息
- DosTips论坛主题为什么使用
而不是echo/
(或echo更好。
)输出空行echo”“
cd%%i
之后的循环中添加mkdir测试
,即使echo%cd%
告诉您不在子文件夹中,您也会看到自己在子文件夹中;奇怪的是,在执行FOR命令之前,命令块中的当前目录字符串以(
开头,以匹配的结尾)取代了%CD%
。您需要启用并使用!CD代码>。在命令提示窗口中运行set/?
,并在几页上阅读整个帮助输出,解释扩展延迟的原因。注意:cd%%i
正在按预期工作,您只是无法正确显示当前目录,因为没有对环境变量引用使用延迟扩展。感谢您的解决方案。