batch filevariables在for循环中初始化

我有一个batch file,它通过在for循环中的SET初始化variables,用于磁盘上的一组文件:

for %%f in (%MYTARGETDIR%\*config.xml) do ( SET TMPFILE=%%F.tmp echo In loop %TMPFILE% ) echo End loop %TMPFILE% 

当我在一个全新的命令行(没有定义TMPFILE)中运行这个时,In循环回显为空,但是结束循环回显不是。

当我第二次运行,它已经设置,并输出它的值,忽略集合,直到循环closures。

想法为什么这是,以及解决方法是什么?

Solutions Collecting From Web of "batch filevariables在for循环中初始化"

这是因为()块只被解析一次,所以它在运行循环之前会替换%TMPFILE%。

为了记录,更正后的脚本如下所示:

 setlocal ENABLEDELAYEDEXPANSION for %%f in (%MYTARGETDIR%\*config.xml) do ( SET TMPFILE=%%F.tmp echo In loop !TMPFILE! ) echo End loop %TMPFILE% 

感谢克里斯的帮助。

这是因为读取命令时环境变量被替换。 对于以下命令:

 for %%f in (%mytargetdir%\*config.xml) do ( set tmpfile=%%f.tmp echo In loop %tmpfile% ) 

整个命令(从前到右括号)在执行之前被读取和替换。

您需要使用延迟扩展,例如:

 @echo off setlocal enableextensions enabledelayedexpansion set full=/u01/users/pax :loop1 if not "!full:~-1!" == "/" ( set full2=!full:~-1!!full2! set full=!full:~,-1! goto :loop1 ) echo !full! endlocal 

启用延迟扩展时, "%"标记仍然像以前那样工作,但可以使用"!" 标记做延迟扩展。

您也可以使用CALL SET而不是延迟扩展。

通常,我使用/ e:on和/ v:on开关调用CMD.EXE以启用命令扩展和延迟变量扩展。 然后,我使用的任何批处理脚本都会被编码,以检查是否打开了延迟变量扩展。

这是我第一次听说SETLOCAL正在进行争论。 我检查了SETLOCAL /? 果然! 对我来说,这是一个节省时间和代码的地方。

但是,我注意到在SETLOCAL将识别ENABLEDELAYEDEXPANSION选项之前,必须在CMD.EXE中启用命令扩展。 这是从SETLOCAL /?的输出

 If Command Extensions are enabled SETLOCAL changes as follows: SETLOCAL batch command now accepts optional arguments: ENABLEEXTENSIONS / DISABLEEXTENSIONS enable or disable command processor extensions. These arguments takes precedence over the CMD /E:ON or /E:OFF switches. See CMD /? for details. ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION enable or disable delayed environment variable expansion. These arguments takes precedence over the CMD /V:ON or /V:OFF switches. See CMD /? for details. 

谢谢你们这个宝贵的答案。