循环分配变量(批处理文件)

时间:2020-10-20 00:04:40

标签: batch-file

我将把整个问题简化为一个非常简单的问题。如何在批处理文件的for循环内分配变量?

如果我在Windows中使用以下批处理文件:

for %%f in (.\Update\!dos\*.zip) do (
    echo %%f
    set FileName3=%%f
    echo %FileName3%
    pause
)

它将echo设置为%%f的适当值,但echo设置为%FileName3%没有任何作用

然后我通过直接分配FileName3test这样的直接值来测试它,但失败了。

在寻找解决方案时,常用的指针是SETLOCAL enabledelayedexpansion

但是,如果我将其添加到批处理文件的顶部,它将停止运行。因此,尽管我认为这很可能是解决方案的一部分,但无法运行批处理文件进行测试,但我无法确定。

为清楚起见,在批处理文件顶部使用SETLOCAL enabledelayedexpansion,如果我双击该文件,则不会发生任何事情。如果我从命令行运行它,它会返回到提示符,好像什么都没发生。

所以我的问题是,如何在批处理文件的循环中分配变量?如果答案是使用SETLOCAL enabledelayedexpansion,那么为什么要将它添加到我的批处理文件中,导致它绝对不起作用。

1 个答案:

答案 0 :(得分:0)

在您的情况下,无法在脚本顶部启用延迟扩展。原因是源位置的一部分包含!字符,由于延迟扩展,该字符将从名称中省略,并且脚本将结束,因为路径.\Update\dos\不存在。 / p>

诀窍是仅在需要的地方启用延迟扩展。

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
If Not Exist "Update\!dos\*.zip" GoTo :EOF
For %%G In ("Update\!dos\*.zip") Do (
    Echo %%G
    Set "FileName3=%%G"
    SetLocal EnableDelayedExpansion
    Echo !FileName3!
    EndLocal
)
Pause

但是,您需要了解的是,在循环SetLocal中定义的任何变量在下一个EndLocal时都将变为未定义。这意味着,如果您稍后在代码中需要这些变量,则需要使用一种将这些变量传递到EndLocal障碍中的方法。 但这超出了您的特定代码示例的范围,因此未包含在此示例中。