Wie erstelle ich eine Endlosschleife in einer Windows-Batchdatei?

160

Dies ist im Grunde das, was ich in einer Batch-Datei möchte. Ich möchte in der Lage sein, "Do Stuff" erneut auszuführen, wenn ich eine beliebige Taste drücke, um über die "Pause" hinauszugehen.

while(true){
    Do Stuff
    Pause
}

Anscheinend sind nur forSchleifen verfügbar und keine whileSchleifen im Stapel. Wie erstelle ich dann eine Endlosschleife?

Sooprise
quelle
4
Fragen Sie nach einer Windows / DOS-Batchdatei?
Thkala
Ja, tut mir leid, dass ich vage bin, ich werde einen Nachtrag zum OP machen.
Sooprise
1
+1 ooops, ich habe gepostet, ohne die andere Antwort zu bemerken!
PA.
Sie können verwenden For Commandoder verknüpfen
Wissenschaftler_7

Antworten:

289

Wie wäre es mit guten (?) Alten goto?

:loop

echo Ooops

goto loop

Siehe auch dies für ein nützlicheres Beispiel.

thkala
quelle
nicht gut: D manchmal schneller, aber nie gut: D ok, es gibt nur einen guten Platz für goto - in der niedrigsten Programmierung x)
jave.web
Ich stimme jave.web zu. Sie sollten den folgenden for-Schleifenvorschlag verwenden. Sie sollten goto fast nie in Ihrem Code verwenden, auch wenn es sich um Skripte handelt. Goto war in den GW Basic-Tagen in den 80ern cool.
DoodleKana
Und von cmd prompt?
theonlygusti
13
Ich bin mit jave.web nicht einverstanden - es ist nichts falsch mit goto, wenn Sie es richtig verwenden. Zum Beispiel werde ich es verwenden, um sicherzustellen, dass das Programm, das in der Schleife ausgeführt wird, automatisch erneut erscheint, wenn es aus irgendeinem Grund stirbt. Es kann jedoch ratsam sein, eine kleine Wartezeit in die Schleife zu setzen, um das CPU-Thrashing zu stoppen, wenn mein Programm aus irgendeinem Grund sofort stirbt.
John Hunt
1
@theonlygusti Funktioniert nicht wie erwartet als einzeiliger Befehl :lbl & echo Ooops & goto lbl. aber @Nicholis Kommentar unten tut :FOR /L (1,0,2) DO @echo Oops
JimB
77

Unbegrenzte Schleife im einzeiligen Befehl zur Verwendung in cmdWindows:

FOR /L %N IN () DO @echo Oops

Geben Sie hier die Bildbeschreibung ein

Nabi KAZ
quelle
7
So verwenden Sie das in einem Batch-Dateityp: FOR / L %% N IN () DO @echo Hoppla
Phil Roggenbuck
Dies ist eine unterbewertete Antwort. Danke dir!
var Vorname
63

Eine wirklich unendliche Schleife, die von 1 bis 10 mit einem Inkrement von 0 zählt.
Sie benötigen unendlich oder mehr Inkremente, um die 10 zu erreichen.

for /L %%n in (1,0,10) do (
  echo do stuff
  rem ** can't be leaved with a goto (hangs)
  rem ** can't be stopped with exit /b (hangs)
  rem ** can be stopped with exit
  rem ** can be stopped with a syntax error
  call :stop
)

:stop
call :__stop 2>nul

:__stop
() creates a syntax error, quits the batch

Dies kann nützlich sein, wenn Sie eine wirklich Endlosschleife benötigen, da diese viel schneller als eine goto :loopVersion ist, da eine for-Schleife beim Start einmal vollständig zwischengespeichert wird.

jeb
quelle
17
Schön, weil es auch funktioniert, wenn man es einfach an der Eingabeaufforderung eingibt. für / L% n in (1,0,2) do @echo. "Hallo Leute"
Nicholi
Ich wünschte, diese Lösung hätte etwas mehr Erklärung.
Nelda.techspiress
19

lesen help GOTO

und versuche

:again
do it
goto again
PA.
quelle
4

Eine andere bessere Möglichkeit:

:LOOP
timeout /T 1 /NOBREAK 
::pause or sleep x seconds also valid
call myLabel
if not ErrorLevel 1 goto :LOOP

Auf diese Weise können Sie auch Fehler beheben

Julito Sanchis
quelle
1

Hier ist ein Beispiel für die Verwendung der Schleife:

echo off
cls

:begin

set /P M=Input text to encode md5, press ENTER to exit: 
if %M%==%M1% goto end

echo.|set /p ="%M%" | openssl md5

set M1=%M%
Goto begin

Dies ist der einfache Stapel, den ich verwende, wenn ich eine Nachricht unter Windows in md5-Hash verschlüsseln muss (openssl erforderlich), und das Programm würde sich loyal wiederholen, außer wenn Strg + C oder leere Eingaben gegeben sind.

user1147015
quelle