为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星coding 2019-12-05 14:34:53
我有一个批处理文件,该文件通过for循环内的SET初始化变量,用于磁盘上的一组文件:for %%f in (%MYTARGETDIR%\*config.xml) do (  SET TMPFILE=%%F.tmp  echo In loop %TMPFILE%)echo End loop %TMPFILE%当我在全新的命令外壳程序(未定义TMPFILE)中运行此命令时,In循环回显为空,但end循环回显则不为空。当我第二次运行时,它已经设置好了,并输出它的值,而忽略了设置,直到循环关闭。为什么会这样,以及解决方法是什么?
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-12-05
?
慕容森

TA贡献1853条经验 获得超18个赞

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


setlocal ENABLEDELAYEDEXPANSION


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


  SET TMPFILE=%%F.tmp


  echo In loop !TMPFILE!

)


echo End loop %TMPFILE%

谢谢克里斯的帮助。


查看完整回答
反对 回复 2019-12-05
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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


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

启用延迟扩展后,"%"标记仍然像以前一样工作,但是您可以使用"!"标记来执行延迟扩展。


查看完整回答
反对 回复 2019-12-05
  • 3 回答
  • 0 关注
  • 435 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信