Batch-Skriptschleife

275

Ich muss einen Befehl 100-200 Mal ausführen, und meine Forschung hat bisher ergeben, dass ich entweder 100 Kopien dieses Befehls kopieren / einfügen oder eine forSchleife verwenden formüsste , aber die Schleife erwartet eine Liste von Elementen, daher würde ich benötigen 200 zu bearbeitende Dateien oder eine Liste mit 200 Elementen, die den Punkt zunichte machen.

Ich würde lieber kein C-Programm schreiben und die Länge der Dokumentation durchgehen müssen, warum ich ein anderes Programm schreiben musste, um mein Programm zu Testzwecken auszuführen. Eine Änderung meines Programms selbst ist ebenfalls keine Option.

aWie würde ich einen Befehl bei einem Befehl Nüber ein Batch-Skript ausführen ?

Hinweis: Ich möchte keine Endlosschleife

Hier ist zum Beispiel, wie es in Javascript aussehen würde:

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

Wie würde es in einem Batch-Skript unter Windows aussehen?

Tom J Nowell
quelle

Antworten:

523

for /l ist dein Freund:

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

Beginnt bei 1, Schritt für Schritt und endet bei 100.

Verwenden Sie zwei %s, wenn es sich um eine Batch-Datei handelt

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

(Das ist eines der Dinge, die ich an Windows-Skripten wirklich sehr hasse.)

Wenn Sie für jede Iteration der Schleife mehrere Befehle haben, gehen Sie folgendermaßen vor:

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

oder in einer Batch-Datei

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

Schlüssel:
/lbedeutet, dass der forBefehl numerisch ausgeführt wird, anstatt eine Reihe von Dateien zu
%xbearbeiten. Dies ist die Schleifenvariable
(Startwert, Wertinkrement, Endbedingung [einschließlich]).

Jon
quelle
2
Das hängt davon ab, wie wörtlich wir die "DOS" -Referenz nehmen sollen. Die neueste Version von MS-DOS, 7.1, stammt aus dem Jahr 1997 und AFAIK verfügt nicht über diese Erweiterungen. Die mit Windows gelieferten Befehls-Shells hingegen natürlich.
Carl Smotricz
8
@Imray %xist die Schleifenvariable. /l(Nicht \l) bedeutet, dass der Befehl for numerisch und nicht mit einer Reihe von Dateien ausgeführt wird.
Jon
19
Durch Ausführen for /l %x in (1, 1, 100) do echo %xbekomme ich "x nicht erwartet".
LaBracca
2
@ user193655 Lesen Sie den Rest der Antwort. Sie müssen die% s verdoppeln, wenn Sie dies in einer Batch-Datei tun.
Jon
7
% x in der letzten Schleife sollte %% x sein.
Wildpointercs
63

Und um die Dateien eines Verzeichnisses zu durchlaufen:

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

Sie müssen "enableDelayedExpansion" und! FILENAME! anstelle von $ FILENAME $. Im zweiten Fall interpretiert DOS die Variable nur einmal (bevor sie in die Schleife eintritt) und nicht jedes Mal, wenn sich das Programm wiederholt.

Olivier Faucheux
quelle
19
Vielen Dank für die Veröffentlichung - ich weiß, es ist nicht das, was das OP gefragt hat, aber es ist das, wonach ich gesucht habe, als ich hier gelandet bin.
BrainSlugs83
24

Vorlage für eine einfache, aber gezählte Schleife:

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

Beispiel: Sagen Sie "Hallo Welt!" 5 mal:

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

In diesem Beispiel wird Folgendes ausgegeben:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .
FluorescentGreen5
quelle
Dies ist der einzige Loop-Code, den ich auf meinem Win7-PC verwenden konnte. Alle anderen durch Google gefundenen funktionieren nicht.
LaBracca
2
In Ihrem Beispiel würde ich hinzufügen, set /p loopcount="How many loops? "damit Sie es mit Benutzereingaben ausführen können. Es ist praktischer.
1934286
8

Sie können dies auch anstelle einer forSchleife versuchen :

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

Es ist ziemlich klein und ich benutze es die ganze Zeit.

BlazeLP
quelle
1
Dies ist im Grunde identisch mit der Antwort von Marcus Culver . Bitte posten Sie keine Antworten, die nichts Neues hinzufügen. Danke dir!
Fabio sagt Reinstate Monica
Ups sry hat das nicht gesehen, ist einfach geflogen, hat es geworfen und nur für Schleifen gesehen ... Es tut mir leid :)
BlazeLP
6

Oder Sie können eine Variable um die Anzahl der Schleifen dekrementieren / inkrementieren:

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

Die Nutzung FOR /List natürlich die Autobahn und dies ist die Seitenstraße, die länger dauert, aber zum selben Ziel führt.

Mechaflash
quelle
5

Sie können Folgendes tun, um die FOR-Schleife zu vermeiden.

set counter=0
:loop
echo "input commands here"
SET /A counter=%counter%+1
if %counter% GTR 200
(GOTO exit) else (GOTO loop)
:exit
exit
Marcus Culver
quelle
2

Sie können dies ohne forAussage tun ^. ^:

@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

Es hat Grundverständnis. Probieren Sie es einfach aus. : P.

zask
quelle
1
Sie brauchen hier keine verzögerte Erweiterung.
Stephan
2

Sehr einfache Methode zum Implementieren von Schleifen in der Cmd-Programmierung mithilfe von 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
)
Rakesh Chaudhari
quelle
1

DOS bietet hierfür keine sehr eleganten Mechanismen, aber ich denke, Sie können mit angemessenem Aufwand immer noch eine Schleife für 100 oder 200 Iterationen codieren. Obwohl es keine numerische forSchleife gibt, können Sie eine Zeichenfolge als "Schleifenvariable" verwenden.

Codieren Sie die Schleife mit GOTO und SET X=%X%@fügen Sie für jede Iteration ein weiteres @Vorzeichen zu einer Umgebungsvariablen X hinzu. und um die Schleife zu verlassen, vergleichen Sie den Wert von X mit einer Zeichenfolge aus 100 (oder 200) @Zeichen.

Ich habe nie gesagt, dass dies elegant ist, aber es sollte funktionieren!

Carl Smotricz
quelle
1
Die /aOption des SETBefehls wertet einen numerischen Ausdruck für den Wert auf der rechten Seite aus. Siehe die Doucmentation für SET . Es ist nicht erforderlich, den Verkettungstrick auszuführen.
Adam Porad
2
Für DOS ist dies erforderlich, da es set /ain DOS keine gibt . Zum Glück ist die Frage für cmd... (zum Zeitpunkt dieser Antwort war der Fragentitel "DOS Batch Script Loop"
Stephan
0

Ich bin mir nicht sicher, ob eine solche Antwort bereits eingereicht wurde, aber Sie könnten Folgendes versuchen:

@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

Die Variable% var% erhöht sich um eins, bis sie 100 erreicht, wo das Programm dann ausgibt, dass die Ausführung beendet ist. Auch hier bin ich mir nicht sicher, ob dies eingereicht wurde oder so, aber ich denke, es ist möglicherweise das kompakteste.

Josh Girouard
quelle
0

Ich benutze das. Es ist ungefähr dasselbe wie die anderen, aber es ist nur eine andere Art, es zu schreiben.

@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
Jordan B.
quelle
0

Die Antwort hängt wirklich davon ab, wie gut Sie mit Batch vertraut sind. Wenn Sie nicht so erfahren sind, würde ich empfehlen, eine Schleifenvariable zu erhöhen:

@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

Wenn Sie jedoch mehr Erfahrung mit Chargen haben, würde ich empfehlen, je praktischer for /l %loop in (1, 1, 10) do echo %loopdie bessere Wahl ist.

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

Hier ist ein Vorlagenskript, das ich verwenden werde.

@echo off
goto Loop

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

exit

Wenn es startet, schaltet es das Echo aus und danach läuft die "Schleife", aber an dieser Stelle geht es weiter zur "Schleife" (ich hoffe, das hilft.)

Doggo
quelle
0

eine völlig fehlerfreie Schleife

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

Sie können es bearbeiten, indem Sie die 10 in Zeile 5 in eine beliebige Zahl ändern, um anzugeben, wie oft die Schleife ausgeführt werden soll.

guest257351
quelle
-2

(BEARBEITET) Ich habe es so gemacht, dass es nach 100 Mal aufhört

@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

Dies erzeugt 4 Zufallszahlen pro 1 Sekunde 100 Mal. Nehmen Sie das "Timeout 1 / nobreak> nul" heraus, damit es super schnell geht.

Manny
quelle
3
Die Frage war "100 - 200 mal", nicht "Endlosschleife".
Stephan
-2

Verwenden Sie wahrscheinlich goto like

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

Dies macht eine inf (Endlosschleife).

Lamdenny5ONROBLOX
quelle
Nun, infiniteist ziemlich viel größer als die angeforderte 100-200 times, so dass dies die Frage nicht beantwortet.
Stephan
In der Tat wollte ich in der Lage sein, eine festgelegte Anzahl von Schleifen zu wiederholen, damit ich nicht immer wieder kopieren und einen Befehl einfügen musste
Tom J Nowell
-2

Ich habe 2 Antworten Methoden 1: Fügen Sie Javascript in Batch ein

@if (@a==@b) @end /*

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(Ich weiß nicht viel über JavaScript)

Methode 2: Schleife im Stapel

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

(Danke FluorescentGreen5)

Cocos Nucifera
quelle
1
Wir freuen uns über Ihren Versuch, einen Beitrag zu leisten, aber das wörtliche Wiederholen einer fünf Jahre alten Antwort hilft nicht viel und fügt nur Lärm hinzu.
Stephan