使用Windows批处理脚本计数FOR循环

dja*_*fan 31 windows cmd batch-file

有谁能解释一下?我可以使用Windows命令提示符循环计数,使用此方法:

SET /A XCOUNT=0
:loop
SET /A XCOUNT+=1
echo %XCOUNT%
IF "%XCOUNT%" == "4" (
  GOTO end
) ELSE (
  GOTO loop
)
:end
Run Code Online (Sandbox Code Playgroud)

但是这种方法不起作用(它为文件中的每一行打印出"1").它的作用就像变量超出范围:

SET /A COUNT=1
FOR /F "tokens=*" %%A IN (config.properties) DO (
  SET /A COUNT+=1
  ECHO %COUNT%
)
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 59

它不起作用,因为它开始执行之前,当遇到它时,正在评估整个 for循环(从for最终的右括号,包括那些之间的命令).

换句话说,在运行循环之前将%count%其替换为其值1.

你需要的是:

setlocal enableextensions enabledelayedexpansion
set /a count = 1
for /f "tokens=*" %%a in (config.properties) do (
  set /a count += 1
  echo !count!
)
endlocal
Run Code Online (Sandbox Code Playgroud)

使用!而不是延迟扩展%将为您提供预期的行为.另见这里.


还要记住,setlocal/endlocal实际上限制了内部变化的范围,以便它们不会泄漏.如果你想在count 之后使用endlocal,你必须使用你所遇到的问题所带来的"技巧":

endlocal && set count=%count%
Run Code Online (Sandbox Code Playgroud)

让我们说count在内在范围内成​​为7.因为整个命令在执行之前被解释,所以它实际上变为:

endlocal && set count=7
Run Code Online (Sandbox Code Playgroud)

然后,当它执行时,内部范围被关闭,返回count其原始值.但是,由于count在外部范围内设置为7,因此它会有效地泄露您需要的信息.

您可以将多个子命令串在一起,以便根据需要泄漏尽可能多的信息:

endlocal && set count=%count% && set something_else=%something_else%
Run Code Online (Sandbox Code Playgroud)

  • 不会只用`SETLOCAL ENABLEDELAYEDEXPANSION`减去`ENABLEEXTENSIONS`吗? (3认同)

小智 17

对于a = 1到100步骤1

Windows中的命令行.如果在批处理文件中运行,请使用%% a.

    for /L %a in (1,1,100) Do echo %a 
Run Code Online (Sandbox Code Playgroud)

  • 当我搜索"计数循环窗口批处理"时,这就是我正在寻找的答案 (7认同)
  • 您的回答与问题无关 (3认同)
  • `for/L%a in(1,1,100)对于a = 1到100步1_1_的伪___回显%a`是一个很糟糕的例子.一个更好的是`for/L%a in(1,5,100)do echo%a` for pseudo ___ for a = 1 to 100 step 5___因为它明确暗示语法`for/L%a in(start,step,end )` (2认同)