批处理文件中的for循环

Vin*_*ala 0 scripting windows batch-file

预期输入:开始=1,结束=500,间隔=100

预期输出:

1, 100

101, 200

201, 300

301, 400

401、500

@echo off
set start=1
set end=500   
set interval=100
for /L %%g in (%start%, %interval%, %end%) do (
set first=%%g
set /a last=%first% -1 + %interval%
echo %first% , %last%

)
Run Code Online (Sandbox Code Playgroud)

实际输出:

401, 401 -1 + 100

401, 401 -1 + 100

401, 401 -1 + 100

401, 401 -1 + 100

401, 401 -1 + 100

不知道为什么 first 被分配了 401 值,感谢任何帮助

dbe*_*ham 5

这是一个经典的延迟扩展问题。在命令提示符下键入help setset /?以讨论延迟扩展(在完整帮助的一半之后)。

%var%解析该行时会发生正常扩展 using 。问题是你的整个 FOR 循环块在一次传递中被解析。所以你会看到一个在循环开始之前就存在的常量值。401 的值可能是上次运行时遗留下来的。

解决方案是延迟扩展。首先,您必须使用setlocal enableDelayedExpansion. 然后你使用!var!而不是%var%. 这将在执行时而不是在解析时给出值。

此外,使用set /a.

@echo off
setlocal enableDelayedExpansion
set start=1
set end=500
set interval=100
for /L %%g in (%start%, %interval%, %end%) do (
  set /a first=%%g, last=first-1+interval
  echo !first!, !last!
)
Run Code Online (Sandbox Code Playgroud)