我将把整个问题简化为一个非常简单的问题。如何在批处理文件的for循环内分配变量?
如果我在Windows中使用以下批处理文件:
for %%f in (.\Update\!dos\*.zip) do (
echo %%f
set FileName3=%%f
echo %FileName3%
pause
)
它将echo
设置为%%f
的适当值,但echo
设置为%FileName3%
没有任何作用
然后我通过直接分配FileName3
到test
这样的直接值来测试它,但失败了。
在寻找解决方案时,常用的指针是SETLOCAL enabledelayedexpansion
但是,如果我将其添加到批处理文件的顶部,它将停止运行。因此,尽管我认为这很可能是解决方案的一部分,但无法运行批处理文件进行测试,但我无法确定。
为清楚起见,在批处理文件顶部使用SETLOCAL enabledelayedexpansion
,如果我双击该文件,则不会发生任何事情。如果我从命令行运行它,它会返回到提示符,好像什么都没发生。
所以我的问题是,如何在批处理文件的循环中分配变量?如果答案是使用SETLOCAL enabledelayedexpansion
,那么为什么要将它添加到我的批处理文件中,导致它绝对不起作用。
答案 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
障碍中的方法。 但这超出了您的特定代码示例的范围,因此未包含在此示例中。