Ciclo di script batch

Ho bisogno di eseguire un comando 100-200 volte, e finora la mia ricerca indica che avrei dovuto copiare / incollare 100 copie di questo comando, O usare un ciclo for , ma il ciclo for aspetta un elenco di elementi, quindi io avrebbero bisogno di 200 file per operare, o una lista di 200 articoli, sconfiggendo il punto.

Preferirei non dover scrivere un programma in C e documentarmi sul perché ho dovuto scrivere un altro programma per eseguire il mio programma a scopo di test. Anche la modifica del mio programma non è un’opzione.

Quindi, dato un comando, a , come dovrei eseguirlo N volte tramite uno script batch?

for /l è tuo amico:

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

Inizia a 1, passaggi per uno, e termina a 100.

Utilizza due % s se si trova in un file batch

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

(che è una delle cose che odio davvero di Windows Scripting)

Se hai più comandi per ogni iterazione del ciclo, fai questo:

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

o in un file batch

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

Chiave:
/l indica che il comando for funzionerà in modo numerico, anziché operare su un set di file
%x è la variabile dei cicli
(valore iniziale, incremento di valore, condizione finale [incluso])

E per scorrere i file di una directory:

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

Devi utilizzare “enableDelayedExpansion” e! FILENAME! invece di $ FILENAME $. Nel secondo caso, il DOS interpreterà la variabile solo una volta (prima che entri nel ciclo) e non ogni volta che il programma si ripete.

Modello per un ciclo semplice ma conteggiato:

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

Esempio: dì “Hello World!” 5 volte:

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

Questo esempio produrrà:

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

Oppure puoi decrementare / incrementare una variabile in base al numero di volte che vuoi eseguire il loop:

 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 

Ovviamente, usare FOR /L è l’autostrada e questo è il backstreet che impiega più tempo, ma arriva alla stessa destinazione.

Si potrebbe anche provare questo invece di un ciclo for :

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

È piuttosto piccolo ed è quello che uso tutto il tempo.

Si potrebbe fare qualcosa al seguente effetto evitando il 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 

Puoi farlo senza una dichiarazione 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 

Ha una comprensione di base. Basta fare un test. : P

DOS non offre meccanismi molto eleganti per questo, ma penso che si possa ancora codificare un ciclo per 100 o 200 iterazioni con uno sforzo ragionevole. Anche se non esiste un ciclo numerico for ciclo, è ansible utilizzare una stringa di caratteri come “variabile di loop”.

Codifica il ciclo usando GOTO, e per ogni iterazione usa SET X=%X%@ per aggiungere ancora un altro segno @ ad una variabile di ambiente X; e per uscire dal ciclo, confrontare il valore di X con una stringa di 100 (o 200) @ segni.

Non ho mai detto che fosse elegante, ma dovrebbe funzionare!

Un modo molto semplice per implementare il looping nella programmazione in cmd usando le etichette

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

Non sono sicuro che una risposta come questa sia già stata inviata, ma potresti provare qualcosa del genere:

 @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 variabile% var% aumenterà di uno fino a raggiungere 100 dove il programma emetterà quindi che ha terminato l’esecuzione. Ancora una volta, non sono sicuro se questo è stato presentato o qualcosa di simile, ma penso che potrebbe essere il più compatto.

Io uso questo. È quasi la stessa cosa degli altri, ma è solo un altro modo di scriverlo.

 @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 risposta dipende molto dalla familiarità con il batch, se non sei così esperto, ti consiglio di incrementare una variabile di loop:

 @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 

Ma se hai più esperienza con il batch, ti consiglio il più pratico for /l %loop in (1, 1, 10) do echo %loop è la scelta migliore.

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

(MODIFICATO) L’ho fatto in modo che si fermasse dopo 100 volte

 @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 

Questo genererà 4 numeri casuali sempre 1 secondo 100 volte. Elimina il “timeout 1 / nobreak> nul” per renderlo super veloce.