Batch script loop
我需要执行一个命令100-200次,到目前为止我的研究表明,我要么复制/粘贴这个命令的100个副本,要么使用一个
我不想写一个C程序,也不想为了测试的目的而写另一个程序来执行我的程序。修改我的程序本身也不是一个选项。
所以,给定一个命令,
1 | for /l %x in (1, 1, 100) do echo %x |
从1开始,一步一步,到100结束。
如果在批处理文件中,请使用两个
1 | for /l %%x in (1, 1, 100) do echo %%x |
(这是我真正讨厌的关于Windows脚本的事情之一)
如果循环的每个迭代都有多个命令,请执行以下操作:
1 2 3 4 | for /l %x in (1, 1, 100) do ( echo %x copy %x.txt z:\whatever\etc ) |
或者在批处理文件中
1 2 3 4 | for /l %%x in (1, 1, 100) do ( echo %%x copy %%x.txt z:\whatever\etc ) |
关键:
并迭代目录的文件:
1 2 3 4 5 6 7 8 9 | @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! ) |
您必须使用"启用延迟扩展"和!文件名!而不是$filename$。在第二种情况下,DOS只解释一次变量(在它进入循环之前),而不是每次程序循环。
简单但已计数循环的模板:
1 2 3 4 5 6 7 | set loopcount=[Number of times] :loop [Commands you want to repeat] set /a loopcount=loopcount-1 if %loopcount%==0 goto exitloop goto loop :exitloop |
例如:说"你好,世界!"5次:
1 2 3 4 5 6 7 8 9 | @echo off set loopcount=5 :loop echo Hello World! set /a loopcount=loopcount-1 if %loopcount%==0 goto exitloop goto loop :exitloop pause |
此示例将输出:
1 2 3 4 5 6 | Hello World! Hello World! Hello World! Hello World! Hello World! Press any key to continue . . . |
您也可以尝试此方法,而不是使用
1 2 3 4 5 6 | set count=0 :loop set /a count=%count%+1 (Commands here) if %count% neq 100 goto loop (Commands after loop) |
它很小,我一直在用它。
或者,可以按循环次数递减/递增变量:
1 2 3 4 5 6 7 8 9 10 11 12 | 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循环。
1 2 3 4 5 6 7 8 | set counter=0 :loop echo"input commands here" SET /A counter=%counter%+1 if %counter% GTR 200 (GOTO exit) else (GOTO loop) :exit exit |
您可以在没有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @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 |
它有基本的理解。只是测试一下。P
在使用标签的命令编程中实现循环的非常基本的方法
1 2 3 4 5 6 7 8 9 | @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 ) |
DOS不提供非常优雅的机制,但我认为您仍然可以通过合理的努力为100或200次迭代编写循环。虽然没有数字
使用goto对循环进行编码,对于每个迭代,使用
我从来没有说过这是优雅的,但它应该起作用!
答案实际上取决于您对批处理的熟悉程度,如果您没有这样的经验,我建议增加一个循环变量:
1 2 3 4 5 6 7 8 9 10 11 12 | @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 |
但是,如果您对批量产品有更多的经验,我建议您选择更实用的
1 2 | (start at 1, go up in 1's, end at 10) for /l %[your choice] (start, step, end) do [command of your choice] |
我用这个。它和其他的差不多,但它只是另一种写作方式。
1 2 3 4 5 6 7 8 | @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 |
不确定是否已提交类似的答案,但您可以尝试以下操作:
1 2 3 4 5 6 7 8 9 10 11 | @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 |
变量%var%将增加一个,直到它达到100,然后程序输出它已经执行完毕。同样,不确定这是否已经提交或类似的东西,但我认为它可能是最紧凑的。
(编辑)我做了100次后就停了
1 2 3 4 5 6 7 8 9 10 11 | @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",让它运行得非常快。