With the FOR command you can create loops very much like For and For Each loops available in "true" scripting langauges.
However, a recent question I received was if there is a While (or Until) equivalent in batch files.
Well... not exactly, but the following technique comes close:
:LoopStart REM Do something • • REM Break from the loop if a condition is met IF ... GOTO LoopEnd REM Iterate through the loop once more if the condition wasn't met GOTO LoopStart :LoopEnd REM You're out of the loop now • •
This code can be simplified:
:LoopStart REM Do something • • REM Iterate through the loop once more if a condition isn't met IF NOT ... GOTO LoopStart REM Leave the loop if the condition was met REM You're out of the loop now • •
These blocks of code are actually Do...Until loops.
Do...While requires the test of the condition to be done at the beginning of the block:
:LoopStart REM Break from the loop if a condition is met IF ... GOTO LoopEnd REM Do something • • REM Reiterate through the loop once more GOTO LoopStart :LoopEnd REM You're out of the loop now • •
This isn't as readable as "true" scripting languages, but changing the label names might help:
:DoWhile REM Break from the loop if a condition is met IF ... GOTO EndDoWhile REM Do something • • REM Reiterate through the loop once more GOTO DoWhile :EndDoWhile REM You're out of the loop now • •
Or for Do...Until loops:
:DoUntil REM Do something • • REM Iterate through the loop once more if a condition isn't met IF NOT ... GOTO DoUntil REM Leave the loop if the condition was met :EndDoUntil REM You're out of the loop now • •
In this last piece of code I used the :EndDoUntil label only to mark the end of the loop.
It is completely redundant as far as the batch code is concerned, no GOTO :EndDoUntil is used anywhere.
| Note: | Make sure every label in a batch file is unique. If more than a single loop is used in a batch file, suffix the labels with numbers, e.g. :DoUntil1, :EndDoUntil1, :DoUntil2 and :EndDoUntil2. |
page last modified: 2022-03-03; loaded in 0.0013 seconds