Ciclo di script in batch


275

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 forciclo, ma il forciclo si aspetta un elenco di elementi, quindi avrei bisogno 200 file su cui operare, o un elenco di 200 voci, sconfiggendo il punto.

Preferirei non dover scrivere un programma C e documentare il motivo per cui 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, acome lo eseguirò Nvolte tramite uno script batch?

Nota: non voglio un ciclo infinito

Ad esempio, ecco come sarebbe in Javascript:

var i;
for (i = 0; i < 100; i++) {
  console.log( i );
} 

Come sarebbe in uno script batch in esecuzione su Windows?


Risposte:


524

for /l È tuo amico:

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

Inizia da 1, passi per uno e termina a 100.

Usa due %s se è in un file batch

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

(che è una delle cose che odio davvero dello scripting di Windows)

Se si dispone di più comandi per ogni iterazione del ciclo, procedere come segue:

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:
/lindica che il forcomando opererà in modo numerico, anziché operare su un set di file
%xè la variabile loop
(valore iniziale, incremento di valore, condizione finale [compreso])


2
Dipende da quanto letteralmente dobbiamo prendere il riferimento "DOS". L'ultima versione di MS-DOS, 7.1, risale al 1997 e AFAIK non ha queste estensioni. Le shell dei comandi fornite con Windows, ovviamente, lo fanno.
Carl Smotricz,

8
@Imray %xè la variabile loop, /l(non \l) significa che il comando for funzionerà in modo numerico, anziché operare su un set di file.
Jon

19
Eseguendo for /l %x in (1, 1, 100) do echo %xottengo "x non previsto".
LaBracca,

2
@utente193655 leggi il resto della risposta, devi raddoppiare% s se lo stai facendo in un file batch.
Jon

7
% x nell'ultimo ciclo dovrebbe essere %% x.
wildpointercs,

63

E per iterare sui 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 usare "enableDelayedExpansion" e! FILENAME! invece di $ FILENAME $. Nel secondo caso, DOS interpreterà la variabile una sola volta (prima che entri nel ciclo) e non ogni volta che il programma scorre.


19
Grazie per aver pubblicato questo: so che non è quello che l'OP stava chiedendo, ma è quello che stavo cercando quando sono finito qui.
BrainSlugs83,

24

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 genererà:

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

questo è l'unico codice di loop che sono stato in grado di utilizzare sul mio PC win7. Tutti gli altri trovati da Google non funzionano.
LaBracca,

2
Nel tuo esempio, aggiungerei in set /p loopcount="How many loops? "modo che tu possa eseguirlo con l'input dell'utente. È più pratico.
1934286,

8

Puoi anche provare questo invece di un forciclo:

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 sempre.


1
Questo è sostanzialmente identico alla risposta di Marcus Culver . Si prega di non pubblicare risposte che non aggiungono nulla di nuovo. Grazie!
Fabio dice di reintegrare Monica il

Ury sry non lo vide, volò e lo lanciò e vide solo dei loop ...
Mi

6

Oppure puoi decrementare / incrementare una variabile in base al numero di volte che desideri 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 questa è la via secondaria che richiede più tempo, ma arriva alla stessa destinazione.


5

Potresti fare qualcosa con il 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

2

Puoi farlo senza una fordichiarazione ^. ^:

@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


1
non hai bisogno di un'espansione ritardata qui.
Stephan,

2

Modo molto semplice per implementare il looping nella programmazione cmd usando 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
)

1

DOS non offre meccanismi molto eleganti per questo, ma penso che tu possa ancora codificare un ciclo per 100 o 200 iterazioni con ragionevole sforzo. Mentre non c'è un numerofor ciclo , puoi utilizzare una stringa di caratteri come "variabile di ciclo".

Codifica il ciclo usando GOTO, e per ogni iterazione usa SET X=%X%@per aggiungere ancora un altro @segno a una variabile d'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!


1
L' /aopzione del SETcomando valuterà un'espressione numerica per il valore del lato destro. Vedi la doucmentation per SET . Non è necessario eseguire il trucco di concatenazione.
Adam Porad,

2
per DOS, è necessario, in quanto non esiste set /ain DOS. Fortunatamente la domanda è per cmd... (al momento di questa risposta, il titolo della domanda era "ciclo di script batch DOS"
Stephan

0

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 emette che ha terminato l'esecuzione. Ancora una volta, non sono sicuro se questo è stato presentato o qualcosa del genere, ma penso che potrebbe essere il più compatto.


0

Io lo uso È 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

0

La risposta dipende davvero da quanto hai familiarità con il batch, se non sei così esperto, consiglierei di aumentare una variabile di loop:

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

Ma se hai più esperienza con il batch, consiglierei quanto 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]

0

Ecco uno script modello che userò.

@echo off
goto Loop

:Loop
<EXTRA SCRIPTING HERE!!!!>
goto Loop

exit

Ciò che fa è quando inizia disattiva l'eco, dopodiché esegue il "Loop" ma in quel punto continua a "Loop" (spero che questo aiuti.)


0

un ciclo completamente impeccabile

set num=0
:loop
:: insert code
set num=%num%+1
if %num% neq 10 goto loop
::insert after code code

puoi modificarlo cambiando il 10 nella riga 5 in qualsiasi numero per rappresentare quante volte vuoi che sia ripetuto.


-2

(EDITED) L'ho fatto in modo che si fermi 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 ogni 1 secondo 100 volte. Elimina il "timeout 1 / nobreak> nul" per renderlo super veloce.


3
la domanda era "100-200 volte", non "loop infinito".
Stephan,

-2

Usa in modo proverbiale goto like

@echo off
:Whatever
echo hello world
pause
echo TEST
goto Whatever

Questo fa un ciclo inf (infinito).


bene, infiniteè un po 'più grande di quello richiesto 100-200 times, quindi questo non risponde alla domanda.
Stephan,

In effetti, volevo essere in grado di eseguire il loop di un determinato numero di volte in modo da non dover copiare e incollare un comando più e più volte
Tom J Nowell,

-2

Ho 2 risposte Metodi 1: Inserisci Javascript in batch

@if (@a==@b) @end /*

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(Non so molto su JavaScript)

Metodo 2: Loop in batch

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

(Grazie FluorescentGreen5)


1
Apprezziamo il tuo tentativo di contribuire, ma ripetere una risposta verbale di cinque anni non aiuta molto e aggiunge solo rumore.
Stephan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.