Como criar um loop infinito no arquivo em lotes do Windows?


160

Isso é basicamente o que eu quero em um arquivo em lotes. Quero poder executar novamente "Do Stuff" sempre que pressionar qualquer tecla para passar pela "Pausa".

while(true){
    Do Stuff
    Pause
}

Parece que existem apenas forloops disponíveis e sem whileloops no lote. Como crio um loop infinito então?


4
Você está perguntando sobre um arquivo em lotes do Windows / DOS?
thkala

Sim, desculpe por ser vago, vou fazer um adendo ao OP.
sooprise

1
+1 ooops, eu postei sem perceber a outra resposta!
PA.

Você pode usar For CommandOu Fazer a ligação
scientist_7

Respostas:


289

Que tal usar bons (?) Velhos goto?

:loop

echo Ooops

goto loop

Veja também isso para um exemplo mais útil.


não é bom: D, por vezes, mais rápido, mas nunca é bom: ok D há apenas um bom lugar para Goto - no mais baixo programação x)
jave.web

Concordo com o jave.web, você deve usar a sugestão de loop for abaixo. Você quase nunca deve usar goto em seu código, mesmo que seja em script. Goto foi legal nos dias GW Basic nos anos 80.
DoodleKana

E a partir do prompt do cmd?
31515 Theonlygusti

13
Não concordo com o jave.web - não há nada errado com o goto se você o usar corretamente. Por exemplo, estou prestes a usá-lo para garantir que o programa que é executado dentro do loop reaparece automaticamente se morrer por qualquer motivo. No entanto, pode ser aconselhável colocar uma pequena espera no loop para parar a trituração da CPU se meu programa morrer instantaneamente por algum motivo.
John Hunt

1
@theonlygusti Não funciona como um comando de linha única, como seria de esperar :lbl & echo Ooops & goto lbl; mas o comentário de @Nicholi abaixo :FOR /L (1,0,2) DO @echo Oops
JimB 23/09

77

Loop ilimitado no comando de uma linha para uso no cmdWindows:

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

insira a descrição da imagem aqui


7
Para usar isso em um tipo de arquivo batch: FOR / L %% N IN () DO @echo Opa
Phil Roggenbuck

Esta é uma resposta subestimada. Obrigado!
Página Inicial>

63

Um loop realmente infinito, contando de 1 a 10 com incremento de 0.
Você precisa de incrementos infinitos ou mais para atingir o 10.

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

Isso pode ser útil se você precisar de um loop realmente infinito, pois é muito mais rápido que uma goto :loopversão porque um loop for é armazenado em cache completamente uma vez na inicialização.


17
Bom, porque também funciona apenas digitando-o no prompt de comando. para / L% n em (1,0,2) fazer @ echo "hi guys".
Nicholi

Gostaria que esta solução tivesse um pouco mais de explicação.
Nelda.techspiress 01/08/19

19

ler help GOTO

e tentar

:again
do it
goto again

4

Outra maneira melhor de fazer isso:

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

Dessa forma, você também pode cuidar de erros


1

Aqui está um exemplo de como usar o loop:

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

Este é o lote simples que eu uso quando preciso criptografar qualquer mensagem no hash md5 no Windows (é necessário o openssl), e o programa se repete fielmente, exceto se Ctrl + C ou entrada vazia.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.