374

I need to execute a command 100-200 times, and so far my research indicates that I would either have to copy/paste 100 copies of this command, OR use a for loop, but the for loop expects a list of items, so I would need 200 files to operate on, or a list of 200 items, defeating the point.

I would rather not have to write a C program and go through the length of documenting why I had to write another program to execute my program for test purposes. Modification of my program itself is also not an option.

So, given a command, a, how would I execute it N times via a batch script?

Note: I don't want an infinite loop

For example, here is what it would look like in Javascript:

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

What would it look like in a batch script running on Windows?

1

16 Answers 16

704

for /l is your friend:

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

Starts at 1, increments by one, and finishes at 100.

WARNING: Use %% instead of %, if it's in a batch file, like:

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

(which is one of the things I really really hate about windows scripting.)

If you have multiple commands for each iteration of the loop, do this:

for /l %x in (1, 1, 100) do ( echo %x copy %x.txt z:\whatever\etc ) 

or in a batch file:

for /l %%x in (1, 1, 100) do ( echo %%x copy %%x.txt z:\whatever\etc ) 

Key:

  • /l denotes that the for command will operate in a numerical fashion, rather than operating on a set of files
  • %x is the loops variable and will be (starting value, increment of value, end condition[inclusive] )
12
  • 2
    That depends on how literally we are to take the "DOS" reference. The latest version of MS-DOS, 7.1, dates back to 1997 and AFAIK doesn't have these extensions. The command shells delivered with Windows, on the other hand, of course do.CommentedApr 7, 2010 at 11:55
  • 11
    @Imray %x is the loop variable, /l (not \l) means that the for command will operate in a numerical fashion, rather than operating on a set of files.
    – Jon
    CommentedJan 14, 2014 at 23:20
  • 27
    By running for /l %x in (1, 1, 100) do echo %x i get "x not expected".
    – UnDiUdin
    CommentedMar 23, 2015 at 14:58
  • 2
    @user193655 read the rest of the answer, you need to double the %s if you're doing this in a batch file.
    – Jon
    CommentedMar 23, 2015 at 23:47
  • 2
    @Jon, Why is it that two % is required if using a batch file?
    – Pacerier
    CommentedMay 22, 2015 at 9:43
82

And to iterate on the files of a directory:

@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! ) 

You must use "enableDelayedExpansion" and !FILENAME! instead of $FILENAME$. In the second case, DOS will interpret the variable only once (before it enters the loop) and not each time the program loops.

1
  • 28
    Thanks for posting this -- I know it's not what the OP was asking, but it's what I was searching for when I ended up here.CommentedJun 5, 2013 at 20:42
38

Template for a simple but counted loop:

set loopcount=[Number of times] :loop [Commands you want to repeat] set /a loopcount=loopcount-1 if %loopcount%==0 goto exitloop goto loop :exitloop 

Example: Say "Hello World!" 5 times:

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

This example will output:

Hello World! Hello World! Hello World! Hello World! Hello World! Press any key to continue . . . 
2
  • this is the only loop code i was able to use on my win7 pc. All the others found by googleing do not work.
    – UnDiUdin
    CommentedMar 23, 2015 at 14:56
  • 3
    In your example, I would add set /p loopcount="How many loops? " so that you can run it with user input. It's more practical.CommentedFeb 8, 2017 at 0:40
8

You could also try this instead of a for loop:

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

It's quite small and it's what I use all the time.

2
  • 1
    This is basically identical to Marcus Culver's answer. Please do not post answers that do not add anything new. Thank you!CommentedNov 17, 2016 at 19:52
  • Ups sry did not see that, just flew threw it and just saw for loops... Im sorry then :)
    – BlazeLP
    CommentedNov 17, 2016 at 19:57
6

Or you can decrement/increment a variable by the number of times you want to loop:

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 

Obviously, using FOR /L is the highway and this is the backstreet that takes longer, but it gets to the same destination.

    5

    You could do something to the following effect avoiding the FOR loop.

    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

      You can do this without a for statement ^.^:

      @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 

      It has basic understanding. Just give it a test. :P

      1
      • 1
        you don't need delayed expansion here.
        – Stephan
        CommentedJan 25, 2016 at 17:52
      2

      Very basic way to implement looping in cmd programming using labels

      @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 ) 
        2

        a completely flawless loop

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

        you can edit it by changing the 10 in line 5 to any number to represent how many time you want it to loop.

        2
        • This will not work unless you specify /a parameter in the second set command like this: set /a num=%num%+1. Without this, it's not performing arithmetic operation, but just adding "+1" as a string to the original value and you end up with "0+1+1+1+1+1..." string at the end.
          – Martin819
          CommentedNov 1, 2021 at 10:00
        • thanks, I forgot about that, my bad. Started using python and got used to not needing different paramaters.CommentedNov 15, 2021 at 1:15
        1

        DOS doesn't offer very elegant mechanisms for this, but I think you can still code a loop for 100 or 200 iterations with reasonable effort. While there's not a numeric for loop, you can use a character string as a "loop variable."

        Code the loop using GOTO, and for each iteration use SET X=%X%@ to add yet another @ sign to an environment variable X; and to exit the loop, compare the value of X with a string of 100 (or 200) @ signs.

        I never said this was elegant, but it should work!

        2
        • 1
          The /a option of the SET command will evaluate a numerical expression for the right side value. See the doucmentation for SET. It is not necessary to do the concatenation trick.CommentedSep 13, 2013 at 15:16
        • 2
          for DOS, it is neccessary, as there is no set /a in DOS. Luckily the qeustion is for cmd... (at the time of this answer, the question title was "DOS batch script loop"
          – Stephan
          CommentedJul 8, 2016 at 14:25
        1

        The answer really depends on how familiar you are with batch, if you are not so experienced, I would recommend incrementing a loop variable:

        @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 

        But if you are more experienced with batch, I would recommend the more practical for /l %loop in (1, 1, 10) do echo %loop is the better choice.

         (start at 1, go up in 1's, end at 10) for /l %[your choice] (start, step, end) do [command of your choice] 
          0

          I use this. It is just about the same thing as the others, but it is just another way to write it.

          @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

            Not sure if an answer like this has already been submitted yet, but you could try something like this:

            @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 

            The variable %var% will increase by one until it reaches 100 where the program then outputs that it has finished executing. Again, not sure if this has been submitted or something like it, but I think it may be the most compact.

              -1

              Use FOR /l and make sure to use %% instead of % It will save you headaches.

              And try to Set the loop.

              1
              • 2
                Thank you for your participation, but this answer doesn't add any useful information to the twelve years old accepted answer, and so just adds noise and likely attracts downvotes and closure/deletion requests.
                – Stephan
                CommentedJul 13, 2022 at 15:36
              -3

              (EDITED) I made it so it stops after 100 times

              @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 

              This will generate 4 random numbers ever 1 second 100 times. Take out the "timeout 1 /nobreak>nul" to make it go super fast.

              1
              • 4
                the question was "100 - 200 times", not "endless loop".
                – Stephan
                CommentedJul 8, 2016 at 14:27
              -3

              I have 2 answers Methods 1: Insert Javascript into Batch

              @if (@a==@b) @end /* :: batch portion @ECHO OFF cscript /e:jscript "%~f0" :: JScript portion */ Input Javascript here 

              ( I don't know much about JavaScript )

              Method 2: Loop in Batch

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

              (Thanks FluorescentGreen5)

              1
              • 2
                We appreciate your attempt to contribute, but repeating a five year old answer verbatim doesn't help much and just adds noise.
                – Stephan
                CommentedMay 5, 2020 at 10:01

              Start asking to get answers

              Find the answer to your question by asking.

              Ask question

              Explore related questions

              See similar questions with these tags.