在for循环中初始化的批处理文件变量

我有一个批处理文件,该文件通过for循环内的SET初始化变量,用于磁盘上的一组文件:


for %%f in (%MYTARGETDIR%\*config.xml) do (

  SET TMPFILE=%%F.tmp


  echo In loop %TMPFILE%

)


echo End loop %TMPFILE%

当我在全新的命令外壳程序(未定义TMPFILE)中运行此命令时,In循环回显为空,但end循环回显则不为空。


当我第二次运行时,它已经设置好了,并输出它的值,而忽略了设置,直到循环关闭。


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


繁星coding
浏览 441回答 3
3回答

慕田峪4524236

这是因为()块仅解析一次,因此在运行循环之前它将替换%TMPFILE%。

慕容森

记录下来,更正后的脚本如下所示:setlocal ENABLEDELAYEDEXPANSIONfor %%f in (%MYTARGETDIR%\*config.xml) do (  SET TMPFILE=%%F.tmp  echo In loop !TMPFILE!)echo End loop %TMPFILE%谢谢克里斯的帮助。

幕布斯6054654

这是因为读取命令时会替换环境变量。对于以下命令:for %%f in (%mytargetdir%\*config.xml) do (    set tmpfile=%%f.tmp    echo In loop %tmpfile%)for在执行之前,将读取并替换整个命令(从到右括号)。您需要使用延迟扩展,例如:@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启用延迟扩展后,"%"标记仍然像以前一样工作,但是您可以使用"!"标记来执行延迟扩展。
打开App,查看更多内容
随时随地看视频慕课网APP