关于windows:批处理脚本循环

Batch script loop

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

我不想写一个C程序,也不想为了测试的目的而写另一个程序来执行我的程序。修改我的程序本身也不是一个选项。

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


for /l是你的朋友:

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
)

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


并迭代目录的文件:

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 . . .


您也可以尝试此方法,而不是使用for循环:

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 /l是高速公路,这是需要更长时间的后街,但它到达同一个目的地。


您可以对以下效果做些什么,避免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


您可以在没有for声明的情况下执行此操作。

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次迭代编写循环。虽然没有数字for循环,但可以使用字符串作为"循环变量"。

使用goto对循环进行编码,对于每个迭代,使用SET X=%X%@将另一个@符号添加到环境变量x;要退出循环,请将x的值与100(或200)个@符号的字符串进行比较。

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


答案实际上取决于您对批处理的熟悉程度,如果您没有这样的经验,我建议增加一个循环变量:

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

但是,如果您对批量产品有更多的经验,我建议您选择更实用的for /l %loop in (1, 1, 10) do echo %loop

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",让它运行得非常快。