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

时间:2011-09-22 23:38:15

标签: windows batch-file cmd

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

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

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

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

3 个答案:

答案 0 :(得分:53)

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

使用!代替%进行延迟展开会为您提供预期的行为。另请参阅here


另请注意,setlocal/endlocal实际上限制了内部更改的范围,以便它们不会泄漏。如果您希望在<{em> count之后使用endlocal ,则必须使用您遇到的问题所带来的“技巧”:

endlocal && set count=%count%

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

endlocal && set count=7

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

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

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

答案 1 :(得分:14)

对于a = 1到100步骤1

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

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

答案 2 :(得分:0)

这是一个生成所有10.x.x.x地址的批处理文件

@echo off

SET /A X=0
SET /A Y=0
SET /A Z=0

:loop
SET /A X+=1
echo 10.%X%.%Y%.%Z%
IF "%X%" == "256" (
 GOTO end
 ) ELSE (
 GOTO loop2
 GOTO loop
 )


:loop2
SET /A Y+=1
echo 10.%X%.%Y%.%Z%
IF "%Y%" == "256" (
  SET /A Y=0
  GOTO loop
  ) ELSE (
   GOTO loop3
   GOTO loop2
 )


:loop3

SET /A Z+=1
echo 10.%X%.%Y%.%Z%
IF "%Z%" == "255" (
  SET /A Z=0
  GOTO loop2
 ) ELSE (
   GOTO loop3
 )

:end