【问题标题】:Why is variable not redefined with each iteration of for loop batch script?为什么循环批处理脚本的每次迭代都没有重新定义变量?
【发布时间】:2015-08-27 21:49:08
【问题描述】:

我有这个问题,我想在 for 循环的每次迭代中重新定义一个变量。我无法弄清楚为什么这不起作用。我试过搞乱enabledelayedexpansion,但没有成功。

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_time 都会更新。

【问题讨论】:

  • 你掉进了delayed expansion的陷阱!变量 is 已设置,但它较早展开,因此您看不到更新后的值...例如,在 this code 中,存在完全相同的问题...
  • 我应用了您第一个链接中的答案,但它仍然不起作用。是否因为我每次迭代都“从头开始”重新定义变量而有所不同?
  • 延迟扩展也必须应用于!DATE!!TIME!...
  • 您愿意将此作为官方答案吗?
  • 见@Mofi 的answer...

标签: windows batch-file for-loop


【解决方案1】:

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

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

@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 总是更好,例如here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多