批处理脚本循环

我需要执行一个命令100-200次,到目前为止,我的研究表明我要么复制/粘贴这个命令的100个副本,要么使用for循环,但for循环需要一个项目列表,因此我将需要200个文件来操作,或200个项目的清单,因此打败了这一点。

我宁愿不必编写一个C程序,然后仔细阅读为什么我必须编写另一个程序来执行我的程序以进行testing。 我的程序本身的修改也不是一个选项。

所以,给定一个命令,<a>,如何通过批处理脚本执行N次?

for /l是你的朋友:

 for /l %x in (1, 1, 100) do echo %x 

从1开始,逐步完成,并在100完成。

如果在batch file中,请使用两个% s

 for /l %%x in (1, 1, 100) do echo %%x 

(这是我真正讨厌windows脚本的事情之一)

如果循环的每次迭代都有多个命令,请执行以下操作:

 for /l %x in (1, 1, 100) do ( echo %x copy %x.txt z:\whatever\etc ) 

或者在batch file中

 for /l %%x in (1, 1, 100) do ( echo %%x copy %%x.txt z:\whatever\etc ) 

键:
/l表示for命令将以数字方式运行,而不是在一组文件上运行
%x是循环variables
(起始值,增值,结束条件[含])

并迭代一个目录的文件:

 @echo off setlocal enableDelayedExpansion set MYDIR=C:\something for /F %%x in ('dir /B/D %MYDIR%') do ( set FILENAME=%MYDIR%\%%x\log\IL_ERROR.log echo =========================== Search in !FILENAME! =========================== c:\utils\grep motiv !FILENAME! ) 

您必须使用“enableDelayedExpansion”和!FILENAME! 而不是$ FILENAME $。 在第二种情况下,DOS只会解释variables(在进入循环之前)而不是每次程序循环。

简单但计数的循环模板:

 set loopcount=[Number of times] :loop [Commands you want to repeat] set /a loopcount=loopcount-1 if %loopcount%==0 goto exitloop goto loop :exitloop 

例如:说“Hello World!” 5次:

 @echo off set loopcount=5 :loop echo Hello World! set /a loopcount=loopcount-1 if %loopcount%==0 goto exitloop goto loop :exitloop pause 

这个例子会输出:

 Hello World! Hello World! Hello World! Hello World! Hello World! Press any key to continue . . . 

或者你可以按照你想循环的次数递减/递增一个variables:

 SETLOCAL ENABLEDELAYEDEXPANSION SET counter=200 :Beginning IF %counter% NEQ 0 ( echo %x copy %x.txt z:\whatever\etc SET /A counter=%counter%-1 GOTO Beginning ) ELSE ( ENDLOCAL SET counter= GOTO:eof 

显然,使用FOR /L就是高速公路,这是需要更长时间的后街,但是到达相同的目的地。

你可以做一些以下的效果避免FOR循环。

 set counter=0 :loop echo "input commands here" SET /A counter=%counter%+1 if %counter% GTR 200 (GOTO exit) else (GOTO loop) :exit exit 

你也可以尝试这个而不是for循环:

 set count=0 :loop set /a count=%count%+1 (Commands here) if %count% neq 100 goto loop (Commands after loop) 

这是相当小的,这是我一直使用的。

你可以做这个没有for语句^。^:

 @echo off :SPINNER SET COUNTP1=1 :1 CLS :: YOUR COMMAND GOES HERE IF !COUNTP1! EQU 200 goto 2 SET COUNTP1=1 ) ELSE ( SET /A COUNTP1+=1 ) goto 1 :2 :: COMMAND HAS FINISHED RUNNING 200 TIMES 

它有基本的了解。 只要给它一个testing。 :P

DOS不提供非常优雅的机制,但我认为你仍然可以用合理的努力编码一个循环100或200次迭代。 虽然循环中没有数字,但可以使用string作为“循环variables”。

使用GOTO对循环进行编码,对于每次迭代,使用SET X=%X%@将另一个@符号添加到环境variablesX; 并退出循环,将X的值与100(或200) @符号的string进行比较。

我从来没有说过这是优雅的,但它应该工作!

不知道这样的答案是否已经提交,但你可以尝试这样的事情:

 @echo off :start set /a var+=1 if %var% EQU 100 goto end :: Code you want to run goes here goto start :end echo var has reached %var%. pause exit 

variables%var%将增加1,直到达到100,然后程序输出它已经完成执行。 再次,不知道这是否已经提交或类似的东西,但我认为它可能是最紧凑的。

在使用标签的cmd编程中实现循环的非常基本的方法

 @echo off SET /A "index=1" SET /A "count=5" :while if %index% leq %count% ( echo The value of index is %index% SET /A "index=index + 1" goto :while ) 

答案真的取决于你是如何熟悉批处理,如果你不是那么有经验,我会build议增加一个循环variables:

 @echo off set /a loop=1 :repeat echo Hello World! set /a loop=%loop%+1 if %loop%==<no. of times to repeat> ( goto escapedfromrepeat ) goto repeat :escapedfromrepeat echo You have come out of the loop pause 

但是如果你对批处理有更多的经验,我build议for /l %loop in (1, 1, 10) do echo %loop更实用for /l %loop in (1, 1, 10) do echo %loop是更好的select。

  (start at 1, go up in 1's, end at 10) for /l %[your choice] (start, step, end) do [command of your choice] 

我用这个 这与其他人差不多,但这只是另一种写作方式。

 @ECHO off set count=0 :Loop if %count%==[how many times to loop] goto end ::[Commands to execute here] set count=%count%+1 goto Loop :end 

(编辑)我做了它,所以它停止100次后

 @echo off goto actual set /a loopcount=0 :actual set /a loopcount=%loopcount% + 1 echo %random% %random% %random% %random% timeout 1 /nobreak>nul if %loopcount%== 100 goto stop goto actual :stop exit 

这会产生4次随机数,每1秒100次。 拿出“超时1 / nobreak> nul”,让它变得超快。