当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在for循环中初始化的批处理文件变量》经验,为你挑选了4个好方法。

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

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

  echo In loop %TMPFILE%
)

echo End loop %TMPFILE%

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

当我第二次运行时,它已经设置并输出其值,忽略该设置直到循环关闭.

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



1> theschmitzer..:

对于记录,更正后的脚本如下所示:

setlocal ENABLEDELAYEDEXPANSION

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

  SET TMPFILE=%%F.tmp

  echo In loop !TMPFILE!
)

echo End loop %TMPFILE%

谢谢克里斯的帮助.



2> paxdiablo..:

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

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

启用延迟扩展时,"%"标记仍然像以前一样,但您可以使用"!"标记执行延迟扩展.



3> laktak..:

那是因为()块只被解析一次,它在运行循环之前替换了%TMPFILE%.



4> George V. Re..:

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

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有