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

任何人都可以解释吗? 我能够使用Windows命令提示符来循环计数,使用以下方法:

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

但是这种方法不起作用(它为文件中的每一行输出“1”)。 它的行为像variables超出范围:

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

它不起作用,因为整个 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 

延迟扩展使用! 而不是%会给你预期的行为。 另见这里 。


另外请记住, setlocal/endlocal实际上限制了内部变化的范围,以便它们不泄漏。 如果你想在endlocal 使用count ,你必须使用一个“技巧”,使你可能遇到的问题成为可能:

 endlocal && set count=%count% 

假设count在内部范围内变成了7。 由于整个命令在执行之前被解释,所以它实际上变成:

 endlocal && set count=7 

然后,当它被执行时 ,内部范围被关闭,返回到它的原始值。 但是,由于count到七的设置发生在外部范围,所以有效地泄漏了您需要的信息。

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

 endlocal && set count=%count% && set something_else=%something_else% 

对于a = 1至100步骤1

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

  for /L %a in (1,1,100) Do echo %a