Windows 为什么不在for循环批处理脚本的每次迭代中重新定义变量?

Windows 为什么不在for循环批处理脚本的每次迭代中重新定义变量?,windows,batch-file,for-loop,Windows,Batch File,For Loop,我有一个问题,我想在for循环的每次迭代中重新定义一个变量。我不明白这为什么不起作用。我尝试过使用启用延迟扩展,但没有成功 echo off for /f "tokens=1-7 delims=::/ " %%A in ("%DATE% %TIME%") do set capture_time=%%D-%%B-%%C_%%E%%F%%G for /l %%a in (1,1,3) do ( echo %capture_time% timeout 3 /nobreak fo

我有一个问题,我想在for循环的每次迭代中重新定义一个变量。我不明白这为什么不起作用。我尝试过使用
启用延迟扩展
,但没有成功

echo off
for /f "tokens=1-7 delims=::/ " %%A in ("%DATE% %TIME%") do set capture_time=%%D-%%B-%%C_%%E%%F%%G
for /l %%a in (1,1,3) do (
    echo %capture_time%
    timeout 3 /nobreak
    for /f "tokens=1-7 delims=::/ " %%A in ("%DATE% %TIME%") do set capture_time=%%D-%%B-%%C_%%E%%F%%G
)
我想要的输出是这样的:

2015-08-27_132506.50
2015-08-27_132509.50
2015-08-27_132512.50

每次循环运行时,
capture\u time
都会更新。

定义并用
%variable Name%
引用的块内的每个环境变量都已由命令处理器在解析该块时展开。这可以在命令提示符窗口中使用
echo on
运行批处理文件时看到,或者使用
rem
删除或注释掉
@echo off

解决方案是使用延迟扩展,如下所示

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1-7 delims=::/ " %%A in ("%DATE% %TIME%") do set "capture_time=%%D-%%B-%%C_%%E%%F%%G"
for /l %%a in (1,1,3) do (
    echo !capture_time!
    timeout 3 /nobreak
    for /f "tokens=1-7 delims=::/ " %%A in ("!DATE! !TIME!") do set "capture_time=%%D-%%B-%%C_%%E%%F%%G"
)
endlocal
有关延迟扩展的详细信息,请打开命令提示窗口,在那里执行
set/?
,并仔细阅读命令提示窗口中输出的所有帮助页。延迟扩展在示例帮助中进行了解释


例如,解释了为什么使用
set“variable=value”
而不是
set variable=value
总是更好。

您掉进了陷阱!变量已设置,但已提前展开,因此看不到更新的值。。。例如,有完全相同的问题…我应用了你第一个链接的答案,但仍然不起作用。是否因为我在每次迭代中“从头开始”重新定义变量而有所不同?延迟扩展也必须应用于
!约会
!时间…您想将此作为正式答案吗?请参阅@Mofi's。。。