Jak stworzyć nieskończoną pętlę w pliku wsadowym Windows?

160

To jest w zasadzie to, czego chcę w pliku wsadowym. Chcę mieć możliwość ponownego uruchomienia „Do Stuff” za każdym razem, gdy naciskam dowolny klawisz, aby przejść poza „Pause”.

while(true){
    Do Stuff
    Pause
}

Wygląda na to, że fordostępne są tylko pętle i nie ma ich whilew partii. Jak więc stworzyć nieskończoną pętlę?

sooprise
źródło
4
Czy pytasz o plik wsadowy Windows / DOS?
thkala
Tak, przepraszam za niejasność, dodam uzupełnienie do OP.
Sooprise
1
+1 ooops, opublikowałem, nie zauważając drugiej odpowiedzi!
PA.
Możesz użyć For CommandOr Link
scientist_7

Odpowiedzi:

289

Co powiesz na używanie dobrych (?) Starych goto?

:loop

echo Ooops

goto loop

Zobacz także ten bardziej przydatny przykład.

thkala
źródło
nie dobrze: D czasami szybciej, ale nigdy dobrze: D ok jest tylko jedno dobre miejsce na goto - w najniższym programowaniu x)
jave.web
Zgadzam się z jave.web, powinieneś skorzystać z sugestii pętli for poniżej. Prawie nigdy nie powinieneś używać goto w swoim kodzie, nawet jeśli jest to skrypt. Goto był cool w GW Basic w latach 80-tych.
DoodleKana
A z polecenia cmd?
theonlygusti
13
Nie zgadzam się z jave.web - nie ma nic złego w goto, jeśli używasz go poprawnie. Na przykład zamierzam go użyć, aby upewnić się, że program uruchomiony w pętli automatycznie odradza się, jeśli umrze z jakiegokolwiek powodu. Może być jednak rozsądne, aby trochę poczekać w pętli, aby zatrzymać rzucanie cpu, jeśli mój program z jakiegoś powodu natychmiast umrze.
John Hunt
1
@theonlygusti Nie działa jako polecenie jednowierszowe , jak można by się spodziewać :lbl & echo Ooops & goto lbl; ale komentarz @Nicholi poniżej tak :FOR /L (1,0,2) DO @echo Oops
JimB
77

Nieograniczona pętla w poleceniu jednowierszowym do użytku w cmdsystemie Windows:

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

wprowadź opis obrazu tutaj

Nabi KAZ
źródło
7
Aby użyć tego w pliku wsadowym, wpisz: FOR / L %% N IN () DO @echo Ups
Phil Roggenbuck
To jest niedoceniana odpowiedź. Dziękuję Ci!
var firstName
63

Naprawdę nieskończona pętla, licząca od 1 do 10 z przyrostem równym 0.
Aby osiągnąć 10, potrzebujesz nieskończonej lub większej liczby przyrostów.

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

Może to być przydatne, jeśli potrzebujesz naprawdę nieskończonej pętli, ponieważ jest znacznie szybsza niż goto :loopwersja, ponieważ pętla for jest buforowana całkowicie raz podczas uruchamiania.

jeb
źródło
17
Fajnie, ponieważ działa również po prostu wpisując go w wierszu polecenia. for / L% n in (1,0,2) do @echo. "cześć chłopaki"
Nicholi.
Chciałbym, żeby to rozwiązanie miało trochę więcej wyjaśnień.
Nelda.techspiress
19

czytać help GOTO

i próbuj

:again
do it
goto again
ROCZNIE.
źródło
4

Inny lepszy sposób na zrobienie tego:

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

W ten sposób możesz również zająć się błędami

Julito Sanchis
źródło
1

Oto przykład użycia pętli:

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

Jest to prosta partia, której używam, gdy muszę zaszyfrować dowolną wiadomość do skrótu md5 w systemie Windows (wymagany openssl), a program lojalnie się powtórzył, z wyjątkiem podania Ctrl + C lub pustego wejścia.

user1147015
źródło