Batch script loop

Necesito ejecutar un comando 100-200 veces, y hasta ahora mi investigación indica que tendría que copiar / pegar 100 copias de este comando, O usar un ciclo for , pero el ciclo for espera una lista de elementos, por lo tanto, necesitaría 200 archivos para operar, o una lista de 200 elementos, para derrotar el punto.

Preferiría no tener que escribir un progtwig en C y documentar por qué tuve que escribir otro progtwig para ejecutar mi progtwig con fines de prueba. La modificación de mi progtwig tampoco es una opción.

Entonces, dado un comando, a , ¿cómo lo ejecutaría N veces a través de un script por lotes?

for /l es tu amigo:

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

Comienza en 1, pasos por uno, y termina en 100.

Use dos % s si está en un archivo por lotes

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

(que es una de las cosas que realmente odio de Windows scripting)

Si tiene varios comandos para cada iteración del ciclo, haga esto:

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

o en un archivo por lotes

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

Llave:
/l denota que el comando for funcionará en forma numérica, en lugar de operar en un conjunto de archivos
%x es la variable de bucles
(valor inicial, incremento de valor, condición final [incluido])

Y para iterar en los archivos de un directorio:

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

Debe usar “enableDelayedExpansion” y! FILENAME! en lugar de $ FILENAME $. En el segundo caso, DOS interpretará la variable solo una vez (antes de ingresar al ciclo) y no cada vez que el progtwig se repita.

Plantilla para un bucle simple pero contado:

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

Ejemplo: decir “¡Hola, mundo!” 5 veces:

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

Este ejemplo dará como resultado:

 Hello World! Hello World! Hello World! Hello World! Hello World! Press any key to continue . . . 

O puede decrementar / incrementar una variable por el número de veces que quiera hacer un ciclo:

 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 

Obviamente, el uso de FOR /L es la autopista y esta es la calle secundaria que lleva más tiempo, pero llega al mismo destino.

También puedes probar esto en lugar de un ciclo for :

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

Es bastante pequeño y es lo que uso todo el tiempo.

Podría hacer algo con el siguiente efecto evitando el ciclo FOR.

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

Puede hacer esto sin un enunciado for ^. ^:

 @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 

Tiene comprensión básica. Solo dale una prueba. :PAG

DOS no ofrece mecanismos muy elegantes para esto, pero creo que todavía se puede codificar un ciclo de 100 o 200 iteraciones con un esfuerzo razonable. Si bien no hay un bucle numérico for , puede usar una cadena de caracteres como una “variable de bucle”.

Codifique el ciclo usando GOTO, y para cada iteración use SET X=%X%@ para agregar otro signo @ a una variable de entorno X; y para salir del ciclo, compare el valor de X con una cadena de 100 (o 200) signos @ .

Nunca dije que esto fuera elegante, ¡pero debería funcionar!

Una forma muy básica de implementar el bucle en la progtwigción de cmd usando tags

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

No estoy seguro de si ya se ha enviado una respuesta como esta, pero podría intentar algo como esto:

 @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 

La variable% var% boostá en uno hasta llegar a 100, donde el progtwig generará que ha terminado de ejecutarse. Una vez más, no estoy seguro si esto ha sido enviado o algo así, pero creo que puede ser el más compacto.

Yo uso esto. Es casi lo mismo que los demás, pero es solo otra forma de escribirlo.

 @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 

La respuesta realmente depende de cuán familiarizado estés con el lote, si no tienes tanta experiencia, recomendaría incrementar una variable de ciclo:

 @echo off set /a loop=1 :repeat echo Hello World! set /a loop=%loop%+1 if %loop%== ( goto escapedfromrepeat ) goto repeat :escapedfromrepeat echo You have come out of the loop pause 

Pero si tiene más experiencia con el lote, le recomendaría el for /l %loop in (1, 1, 10) do echo %loop más práctico for /l %loop in (1, 1, 10) do echo %loop es la mejor opción.

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

(EDITADO) Lo hice para que pare después de 100 veces

 @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 

Esto generará 4 números aleatorios alguna vez 1 segundo 100 veces. Elimine el “timeout 1 / nobreak> nul” para que sea muy rápido.