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.