批处理脚本循环

时间:2010-04-07 10:54:30

标签: windows batch-file

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

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

因此,根据命令for,如何通过批处理脚本执行a次?

18 个答案:

答案 0 :(得分:468)

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

答案 1 :(得分:57)

并迭代目录的文件:

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

答案 2 :(得分:19)

简单但计数循环的模板:

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

答案 3 :(得分: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是高速公路,这是需要更长时间的后街,但它会到达同一目的地。

答案 4 :(得分:6)

您也可以尝试此操作而不是for循环:

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

它非常小,而且我一直都在使用它。

答案 5 :(得分:4)

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

答案 6 :(得分: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

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:1)

使用标签

在cmd编程中实现循环的非常基本的方法
n=2000

答案 9 :(得分: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,然后程序输出它已完成执行。再次,不确定这是否已提交或类似,但我认为它可能是最紧凑的。

答案 10 :(得分: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

答案 11 :(得分:0)

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

n.currentTarget

但如果您对批处理更有经验,我建议更实用function displayFull(n) { alert(n.currentTarget.id); } 是更好的选择。

@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

答案 12 :(得分:0)

在for循环中使用seq

for i in `seq 1 100`
do 
   echo $i
done

答案 13 :(得分:0)

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

@echo off
goto Loop

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

exit

它的作用是在启动时关闭回声,然后运行“循环”,但是在那个地方,它会一直转到“循环”(我希望这会有所帮助。)

答案 14 :(得分:0)

一个完美无瑕的循环

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

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

答案 15 :(得分:-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

这将产生4个随机数,每1秒100次。 取出&#34;超时1 / nobreak&gt; nul&#34;让它超快。

答案 16 :(得分:-2)

可能会使用goto 喜欢

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

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

答案 17 :(得分:-3)

我有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)