我需要执行一个命令 100-200 次,到目前为止,我的研究表明我要么必须复制/粘贴 100 个该命令的副本,要么使用 for
循环,但 for
循环需要一个列表项目,因此我需要 200 个文件来操作,或者一个包含 200 个项目的列表,这违背了这一点。
我宁愿不必编写 C 程序,也不想写那么多篇幅来记录为什么我必须编写另一个程序来执行我的程序以进行测试。修改我的程序本身也不是一种选择。
那么,给定命令 a
,我将如何通过批处理脚本执行 N
次?
注意:我不想要无限循环
例如,下面是它在 Javascript 中的样子:
var i;
for (i = 0; i < 100; i++) {
console.log( i );
}
在 Windows 上运行的批处理脚本会是什么样子?
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
)
键:
/l
表示 for
命令将以数字方式操作,而不是对一组文件进行操作
%x
是循环变量
(起始值,值增量, 结束条件[含] )
并迭代目录的文件:
@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$。在第二种情况下,DOS 将只解释一次变量(在它进入循环之前),而不是每次程序循环时。
一个简单但计数循环的模板:
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 . . .
set /p loopcount="How many loops? "
以便您可以使用用户输入运行它。它更实用。
您也可以试试这个而不是 for
循环:
set count=0
:loop
set /a count=%count%+1
(Commands here)
if %count% neq 100 goto loop
(Commands after loop)
它很小,是我一直使用的。
你可以做一些事情来避免 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
或者,您可以根据要循环的次数减少/增加变量:
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
是高速公路,这是需要更长时间的后街,但它会到达相同的目的地。
使用标签在 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
)
您可以在没有 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
DOS 没有为此提供非常优雅的机制,但我认为您仍然可以通过合理的努力编写一个循环进行 100 或 200 次迭代。虽然没有数字 for
循环,但您可以将字符串用作“循环变量”。
使用 GOTO 对循环进行编码,并为每次迭代使用 SET X=%X%@
将另一个 @
符号添加到环境变量 X;并退出循环,将 X 的值与 100(或 200)个 @
符号的字符串进行比较。
我从来没有说过这很优雅,但它应该工作!
set /a
。幸运的是 qeustion 是针对 cmd
... (在回答这个问题时,问题标题是“DOS 批处理脚本循环”
不确定是否已经提交了这样的答案,但你可以尝试这样的事情:
@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,然后程序输出它已完成执行。同样,不确定这是否已提交或类似的东西,但我认为它可能是最紧凑的。
我用这个。它与其他的几乎相同,但它只是另一种编写方式。
@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
答案真的取决于你对批处理的熟悉程度,如果你不是那么有经验,我建议增加一个循环变量:
@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 更改为任意数字来对其进行编辑,以表示您希望它循环多少次。
set
命令中指定 /a
参数,如下所示:set /a num=%num%+1
。没有这个,它不会执行算术运算,而只是将“+1”作为字符串添加到原始值,最后会得到“0+1+1+1+1+1...”字符串。
使用 FOR /l
并确保使用 %%
而不是 %
它会让您头疼。
并尝试设置循环。
(已编辑)我做到了,所以它在 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
这将每 1 秒 100 次生成 4 个随机数。去掉“timeout 1 /nobreak>nul”,让它变得超级快。
我有 2 个答案方法 1:将 Javascript 插入批处理
@if (@a==@b) @end /*
:: batch portion
@ECHO OFF
cscript /e:jscript "%~f0"
:: JScript portion */
Input Javascript here
(我对 JavaScript 不太了解)
方法二:批量循环
@echo off
set loopcount=5
:loop
echo Hello World!
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop
pause
(感谢 FluorescentGreen5)
%x
是循环变量,/l
(不是\l
)意味着 for 命令将以数字方式操作,而不是对一组文件进行操作。for /l %x in (1, 1, 100) do echo %x
我得到“x not expected”。%
?