Batch file 在循环中分配变量(批处理文件)

Batch file 在循环中分配变量(批处理文件),batch-file,Batch File,我将把我的整个问题归结为一个非常简单的问题。如何在批处理文件中的for循环中分配变量 如果在windows中使用以下批处理文件: for %%f in (.\Update\!dos\*.zip) do ( echo %%f set FileName3=%%f echo %FileName3% pause ) 它将echo为%f返回正确的值,但echo对%FileName3% 然后,我通过直接分配FileName3一个类似test的直接值来测试它,但失败了 在搜索

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

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

for %%f in (.\Update\!dos\*.zip) do (
    echo %%f
    set FileName3=%%f
    echo %FileName3%
    pause
)
它将
echo
%f
返回正确的值,但
echo
%FileName3%

然后,我通过直接分配
FileName3
一个类似
test
的直接值来测试它,但失败了

在搜索解决方案时,常用的指针是使用is
SETLOCAL enabledelayedexpansion

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

需要说明的是,如果在批处理文件的顶部使用
setlocalenabledayedexpansion
,如果双击该文件,则不会发生任何事情。如果我从命令行运行它,它会返回到提示符,就好像什么都没发生一样


所以我的问题是,如何在批处理文件的循环中分配变量?如果答案是使用
SETLOCAL enabledelayedexpansion
,那么为什么将其添加到我的批处理文件中会导致它完全不做任何事情。

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

诀窍是只在需要时启用延迟扩展

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
如果不存在“更新\!dos\*.zip”转到:EOF
对于%%G In(“更新\!dos\*.zip”)执行以下操作(
回声%%G
设置“FileName3=%%G”
SetLocal EnableDelayedExpansion
回声!文件名3!
端部
)
暂停

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

这是否回答了您的问题?这回答了你的问题吗?缺少实际的批处理文件,不可能说出批处理文件的错误。
setlocal
命令没有理由终止批处理文件。但是,您确实需要确保正确使用变量,即使用
而不是
%
来分隔要参与延迟扩展的变量。有关您需要的所有信息,请参阅建议的副本和许多其他副本。非常感谢您的解释。