¿Cómo crear un bucle infinito en el archivo por lotes de Windows?


160

Esto es básicamente lo que quiero en un archivo por lotes. Quiero poder volver a ejecutar "Do Stuff" cada vez que presione cualquier tecla para pasar la "Pausa".

while(true){
    Do Stuff
    Pause
}

Parece que solo hay forbucles disponibles y no hay whilebucles en lote. ¿Cómo creo un bucle infinito entonces?


44
¿Pregunta sobre un archivo por lotes de Windows / DOS?
thkala

Sí, lo siento por ser vago, haré una adición al OP.
sooprise

1
+1 ¡Vaya, publiqué sin notar la otra respuesta!
PA.

Puede usar For Commando vincular
scientist_7

Respuestas:


289

¿Qué hay de usar bien (?) Viejo goto?

:loop

echo Ooops

goto loop

Vea también esto para un ejemplo más útil.


no es bueno: D a veces más rápido pero nunca es bueno: D ok, solo hay un buen lugar para ir a Goto - en la programación más baja x)
jave.web

Estoy de acuerdo con jave.web, deberías usar la sugerencia de bucle for a continuación. Casi nunca debe usar goto en su código, incluso si es scripting. Goto fue genial en los días de GW Basic en los años 80.
DoodleKana

¿Y desde cmd prompt?
theonlygusti

13
No estoy de acuerdo con jave.web: no hay nada de malo en ir a goto si lo usas correctamente. Por ejemplo, estoy a punto de usarlo para asegurar que el programa que se ejecuta dentro del ciclo se reaparece automáticamente si muere por cualquier razón. Sin embargo, puede ser prudente poner una pequeña espera en el bucle para detener el golpe de CPU si mi programa muere instantáneamente por alguna razón.
John Hunt

1
@theonlygusti No funciona como un comando de una línea, como era de esperar :lbl & echo Ooops & goto lbl; pero el comentario de @Nicholi a continuación sí lo hace :FOR /L (1,0,2) DO @echo Oops
JimB

77

Bucle ilimitado en el comando de una línea para usar en cmdWindows:

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

ingrese la descripción de la imagen aquí


77
Para usar eso en un tipo de archivo por lotes: FOR / L %% N IN () DO @echo Oops
Phil Roggenbuck

Esta es una respuesta subestimada. ¡Gracias!
var firstName

63

Un ciclo realmente infinito, contando de 1 a 10 con un incremento de 0.
Necesita infinitos o más incrementos para alcanzar el 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

Esto podría ser útil si necesita un bucle realmente infinito, ya que es mucho más rápido que una goto :loopversión porque un bucle for se almacena en caché por completo una vez al inicio.


17
Agradable porque también funciona simplemente escribiéndolo en el símbolo del sistema. para / L% n en (1,0,2) do @echo. "hola chicos"
Nicholi

Ojalá esta solución tuviera un poco más de explicación.
Nelda.techspiress


4

Otra mejor manera de hacerlo:

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

De esta manera, también puedes ocuparte de los errores


1

Aquí hay un ejemplo del uso del bucle:

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 es el lote simple que uso cuando necesito encriptar cualquier mensaje en md5 hash en Windows (se requiere openssl), y el programa se repetiría fielmente excepto Ctrl + C o entrada vacía.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.