批处理脚本循环


275

我需要执行一次命令100-200次,到目前为止,我的研究表明我要么必须复制/粘贴该命令的100个副本,要么使用一个for循环,但是该for循环需要一个项目列表,因此我需要要处理200个文件或200个项目的列表,这很重要。

我宁愿不必编写C程序,也不必花大量时间记录为什么我必须编写另一个程序来执行我的程序以进行测试。修改程序本身也不是一种选择。

因此,给定命令,a我将如何N通过批处理脚本执行该命令?

注意:我不要无限循环

例如,这是Javascript中的样子:

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

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


Answers:


524

for /l 是你的朋友:

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

从1开始,以1为步长,以100为结束。

%如果在批处理文件中,请使用2

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是loops变量
(起始值,值的增量,结束条件[包括])


2
这取决于从字面上看如何使用“ DOS”引用。MS-DOS 7.1的最新版本可以追溯到1997年,并且AFAIK没有这些扩展名。另一方面,Windows附带的命令外壳当然可以。
卡尔·斯莫特里奇

8
@Imray %x是循环变量,/l(不是\l)表示for命令将以数字方式操作,而不是对一组文件进行操作。
2014年

19
通过运行for /l %x in (1, 1, 100) do echo %x我得到“ x意外”。
LaBracca 2015年

2
@ user193655阅读其余的答案,如果要在批处理文件中执行此操作,则需要将%s加倍。
2015年

7
最后一个循环中的%x应该是%% x。
wildpointercs

63

并遍历目录的文件:

@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只会解释一次变量(在进入循环之前),而不是每次程序循环都解释一次。


19
感谢您发布此内容-我知道这不是OP所要的,但这是我到这里结束时一直在寻找的内容。
BrainSlugs83 2013年

24

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

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

这是我能够在win7 pc上使用的唯一循环代码。通过Google搜索发现的所有其他搜索均无效。
LaBracca 2015年

2
在您的示例中,我将添加内容,set /p loopcount="How many loops? "以便您可以在用户输入的情况下运行它。比较实用。
1934286 '02 -2-8

8

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

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

它很小,这是我一直使用的。


1
这基本上与Marcus Culver的答案相同。请不要发布没有添加任何新内容的答案。谢谢!
法比奥说莫妮卡(Monica)恢复

Ups sry没看到那件事,只是飞了下去,看到了回圈……对不起:)
BlazeLP

6

或者,您可以按照要循环的次数减少/增加变量:

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


5

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

2

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


1
您不需要在这里延迟扩展。
斯蒂芬

2

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

1

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

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

我从来没有说过这很优雅,但是应该可以!


1
该命令的/a选项SET将计算右侧值的数字表达式。参见SET的文档。不必执行串联技巧。
亚当·波拉德

2
对于DOS,这必需的,因为set /aDOS中没有。幸运的是cmd,问题的答案是……(在回答此问题时,问题标题为“ DOS批处理脚本循环”
Stephan

0

不知道是否已经提交了这样的答案,但是您可以尝试执行以下操作:

@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,然后程序输出完成执行的结果。同样,不确定是否已提交或类似的内容,但我认为它可能是最紧凑的。


0

我用这个 它与其他事物几乎相同,但这只是另一种编写方式。

@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

0

答案确实取决于您对批处理的熟悉程度,如果您不那么熟悉,我建议增加一个循环变量:

@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]

0

这是我将使用的模板脚本。

@echo off
goto Loop

:Loop
<EXTRA SCRIPTING HERE!!!!>
goto Loop

exit

这样做是在启动时关闭回声,然后运行“循环”,但在该位置继续进入“循环”(希望对您有所帮助。)


0

完美无瑕的循环

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

您可以通过将第5行中的10更改为任意数字来表示它要循环多少次来进行编辑。


-2

(编辑)我做到了,所以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个随机数。取出“超时1 / nobreak> nul”使其超快。


3
问题是“ 100-200次”,而不是“无限循环”。
斯蒂芬

-2

像goto那样使用

@echo off
:Whatever
echo hello world
pause
echo TEST
goto Whatever

这会进行inf(无限)循环。


好吧,infinite它比请求的要大很多100-200 times,所以这不能回答问题。
斯蒂芬

确实,我希望能够循环执行一定的次数,因此我不必一遍又一遍地复制粘贴命令
Tom J Nowell

-2

我有2个答案方法1:将 Javascript插入批处理

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

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(我对JavaScript不太了解)

方法2: 批量循环

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

(感谢FluorescentGreen5)


1
感谢您为做出贡献而付出的努力,但是逐字重复5年的回答并没有多大帮助,只会增加噪音。
斯蒂芬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.