批处理脚本循环

问题描述 投票:0回答:16

我需要执行一个命令 100-200 次,到目前为止,我的研究表明我要么必须复制/粘贴该命令的 100 个副本,要么使用

for
循环,但
for
循环需要一个列表的项目,因此我需要 200 个文件来操作,或者一个包含 200 个项目的列表,这违背了这一点。

我宁愿不必编写 C 程序并详细记录为什么我必须编写另一个程序来执行我的程序以进行测试。修改我的程序本身也不是一个选择。

那么,给定一个命令,

a
,我如何通过批处理脚本执行它
N
次?

注意:我不想要无限循环

例如,下面是 JavaScript 中的样子:

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

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

windows loops batch-file
16个回答
686
投票

for /l
是你的朋友:

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

从 1 开始,递增 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
    是循环变量,将是
    (starting value, increment of value, end condition[inclusive] )

80
投票

并迭代目录的文件:

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


35
投票

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

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

9
投票

你也可以尝试这个而不是

for
循环:

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

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


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

3
投票

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

3
投票

一个完全完美的循环

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

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


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
投票

DOS 没有为此提供非常优雅的机制,但我认为您仍然可以通过合理的努力编写 100 或 200 次迭代的循环。虽然没有数字

for
循环,但您可以使用字符串作为“循环变量”。

使用 GOTO 对循环进行编码,并且对于每次迭代,使用

SET X=%X%@
向环境变量 X 添加另一个
@
符号;要退出循环,请将 X 的值与一串 100(或 200)
@
符号进行比较。

我从来没有说过这很优雅,但它应该有用!


1
投票

我用这个。它和其他的差不多,只是另一种写法而已。

@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
投票

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

@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
: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
投票

使用

FOR /l
并确保使用
%%
而不是
%
它会帮你解决头痛问题。

并尝试设置循环。


-3
投票

(已编辑)我做到了,所以它在 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 秒生成 4 个随机数 100 次。 去掉“timeout 1 /nobreak>nul”,让它变得超级快。


-3
投票

我有2个答案 方法一: 将 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

(感谢荧光绿5)

© www.soinside.com 2019 - 2024. All rights reserved.