批处理脚本循环

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

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

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

注意:我不想要一个无限循环

例如,下面是它在Javascript中的样子:

var i;
for (i = 0; i < 100; i++) {
console.log( i );
}

在Windows上运行的批处理脚本会是什么样子?

1125106 次浏览

for /l是你的朋友:

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

从1开始,一步一步,到100结束。

如果在批处理文件中,使用%%而不是%,例如:

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
)

或者在批处理文件中

for /l %%x in (1, 1, 100) do (
echo %%x
copy %%x.txt z:\whatever\etc
)
< p >关键:
/l表示for命令将以数字方式操作,而不是操作一组
的文件 %x是循环变量
(起始值,值的增量,结束条件[包括])

DOS没有为此提供非常优雅的机制,但我认为您仍然可以通过合理的努力编写100或200次迭代的循环。虽然没有数值for循环,但可以使用字符串作为“循环变量”。

使用GOTO编写循环代码,并在每次迭代中使用SET X=%X%@向环境变量X添加另一个@符号;并且要退出循环,将X的值与包含100(或200)个@符号的字符串进行比较。

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

或者你可以根据你想要循环的次数递减/增加一个变量:

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

并迭代一个目录下的文件:

@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!
)

你必须使用“enabledelayeexpansion”和!FILENAME!而不是$FILENAME$。在第二种情况下,DOS只解释变量一次(在它进入循环之前),而不是每次程序循环时都解释。

您可以采取如下措施避免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

一个简单但计数循环的模板:

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

你可以不使用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

它有基本的理解。试一试吧。: P

不确定这样的答案是否已经提交,但你可以尝试这样的回答:

@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%将增加1,直到它达到100,这时程序将输出它已完成执行。同样,不确定这个是否已经提交或类似的东西,但我认为它可能是最紧凑的。

我用这个。它和其他的是一样的,但是它只是另一种写法。

@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次。 取出"timeout 1 /nobreak>nul"使它运行超级快

你也可以尝试用这个代替for循环:

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

它很小,我一直在用它。

使用标签在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
)

答案取决于你对批处理的熟悉程度,如果你不是很有经验,我建议你增加一个循环变量:

@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是更好的选择。

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

完美无缺的循环

set num=0
:loop
:: insert code
set /a num=%num%+1
if %num% neq 10 goto loop
::insert after code code

您可以通过将第5行中的10更改为任何数字来编辑它,以表示希望它循环的时间。

我有两个答案 方法1: 插入Javascript到Batch

@if (@a==@b) @end /*


:: batch portion


@ECHO OFF


cscript /e:jscript "%~f0"




:: JScript portion */


Input Javascript here

(我不太懂JavaScript)

< p >方法2: 在Batch中循环

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

(感谢FluorescentGreen5)

使用FOR /l并确保使用%%而不是%

并尝试设置循环。