【问题标题】:Batch script loop批处理脚本循环
【发布时间】:2011-02-05 05:06:14
【问题描述】:

我需要执行一个命令 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


【解决方案1】:

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 是循环变量
(起始值、递增值、结束条件[含])

【讨论】:

  • 这取决于我们如何理解“DOS”引用。 MS-DOS 的最新版本 7.1 可以追溯到 1997 年,AFAIK 没有这些扩展。另一方面,随 Windows 提供的命令 shell 当然可以。
  • @Imray %x 是循环变量,/l(不是\l)表示for命令将以数字方式操作,而不是对一组文件进行操作。跨度>
  • 通过运行 for /l %x in (1, 1, 100) do echo %x 我得到“x not expected”。
  • @user193655 阅读其余答案,如果您在批处理文件中执行此操作,则需要将 %s 加倍。
  • @Jon,如果使用批处理文件,为什么需要两个%
【解决方案2】:

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

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

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

【讨论】:

  • /a 命令的/a 选项将计算右侧值的数值表达式。请参阅SET 的文档。没有必要做串联技巧。
  • 对于 DOS,它必要的,因为在 DOS 中没有set /a。幸运的是,问题是针对cmd...(在此答案时,问题标题是“DOS 批处理脚本循环”
【解决方案3】:

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

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】:

    并迭代目录的文件:

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

    【讨论】:

    • 感谢您发布此内容——我知道这不是 OP 所要求的,但这是我最终来到这里时所寻找的内容。
    【解决方案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
    

    【讨论】:

      【解决方案6】:

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

      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 电脑上使用的唯一循环代码。谷歌搜索到的所有其他都不起作用。
      • 在您的示例中,我将添加 set /p loopcount="How many loops? " 以便您可以使用用户输入运行它。更实用。
      【解决方案7】:

      您可以在没有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

      【讨论】:

      • 这里不需要延迟扩展。
      【解决方案8】:

      不确定是否已经提交了这样的答案,但您可以尝试以下方法:

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

      【讨论】:

        【解决方案9】:

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

        @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
        

        【讨论】:

          【解决方案10】:

          (已编辑)我做到了,所以它在 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”,让它变得超级快。

          【讨论】:

          • 问题是“100 - 200 次”,而不是“无限循环”。
          【解决方案11】:

          你也可以试试这个,而不是 for 循环:

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

          它很小,我一直都在用它。

          【讨论】:

          • 这与Marcus Culver's answer基本相同。请不要发布不添加任何新内容的答案。谢谢!
          • Ups sry 没有看到,只是飞扔了它,只是看到了循环......我很抱歉 :)
          【解决方案12】:

          在 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
          )
          

          【讨论】:

            【解决方案13】:

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

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

            【讨论】:

              【解决方案14】:

              完美无瑕的循环

              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...”字符串。
              • 谢谢,我忘记了,我的错。开始使用python并习惯了不需要不同的参数。
              【解决方案15】:

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

              (感谢 FluorescentGreen5)

              【讨论】:

              • 我们感谢您的贡献,但逐字重复五年前的答案并没有多大帮助,只会增加噪音。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-12-14
              • 1970-01-01
              • 2013-10-01
              • 2017-02-03
              • 2011-06-07
              • 2023-03-06
              • 1970-01-01
              相关资源
              最近更新 更多