Come mettere in pausa l'esecuzione per un po 'in un file batch di Windows tra un comando e il successivo?
Come mettere in pausa l'esecuzione per un po 'in un file batch di Windows tra un comando e il successivo?
Risposte:
Il modo corretto di dormire in un file batch è utilizzare il timeout
comando, introdotto in Windows 2000.
Per attendere da qualche parte tra 29 e 30 secondi :
timeout /t 30
Il timeout verrebbe interrotto se l'utente premesse un tasto; tuttavia, il comando accetta anche l'opzione opzionale /nobreak
, che ignora effettivamente qualsiasi cosa l'utente possa premere, tranne un esplicito CTRL-C
:
timeout /t 30 /nobreak
Inoltre, se non si desidera che il comando stampi il suo conto alla rovescia sullo schermo, è possibile reindirizzare l'output a NUL
:
timeout /t 30 /nobreak > NUL
Dal momento che si applica anche qui, copierò la mia risposta da un altro sito .
Se vuoi usare il ping, c'è un modo migliore. Ti consigliamo di eseguire il ping di un indirizzo che non esiste, quindi puoi specificare un timeout con precisione in millisecondi. Fortunatamente, un tale indirizzo è definito in uno standard (RFC 3330), e lo è 192.0.2.x
. Questo non è inventato, è davvero un indirizzo al solo scopo di non esistere (potrebbe non essere chiaro, ma si applica anche nelle reti locali):
192.0.2.0/24 - Questo blocco è assegnato come "TEST-NET" per l'uso nella documentazione e nel codice di esempio. Viene spesso utilizzato insieme ai nomi di dominio example.com o example.net nella documentazione del fornitore e del protocollo. Gli indirizzi all'interno di questo blocco non devono apparire su Internet pubblico.
Per dormire per 123 millisecondi, utilizzare ping 192.0.2.1 -n 1 -w 123 >nul
Ping
è semplicemente lo strumento sbagliato per il lavoro.
È inoltre possibile inserire un ping in localhost. Questa operazione richiederà 4 secondi (per impostazione predefinita). È considerato un kludge da alcuni, ma funziona abbastanza bene lo stesso.
Il comando:
ping 127.0.0.1
ping
tuo sistema operativo è presente o meno . Se sei abbastanza preoccupato per '95 '98 o ME, dovresti essere altrettanto preoccupato per 6.22 che non ha ping
neanche
Disclaimer : questa non è la soluzione "ideale", quindi non perdete tempo a picchiarmi sopra la testa con quello come fatto a coloro che raccomandano ping
...
Quando possibile, usare timeout
di sicuro. Ma come notato nei commenti, questa non è sempre un'opzione (ad es. In modalità non interattiva). Dopodiché, concordo sul fatto che ping
"kludge" è forse la migliore opzione successiva, in quanto è molto semplice. Detto questo, offro un'altra opzione ... incorporare alcuni script VB .
La base di questa soluzione ha ogni tipo di applicazione oltre a questo. Spesso VBS può fare cose che il batch non può, o quantomeno farlo con drasticamente più facilità. Usando la tecnica illustrata qui, puoi mescolare i due (non "senza soluzione di continuità", ma "funzionalmente" ...).
Ecco una riga, per creare uno script temporaneo, eseguirlo, quindi eliminarlo. Lo script fa dormire per te (per 3 secondi in questo esempio).
echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs
Ecco praticamente la stessa cosa, scritta in modo leggermente diverso:
set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%
E poi finalmente, come se stesso ping
, CScript
ha un'opzione di timeout! Pertanto, se si inserisce un ciclo infinito nello script, è possibile lasciare che l'interprete imponga la durata. Nota, questa è un'operazione "occupata", che consuma la CPU, e quindi non la consiglio quando puoi usare la WScript.Sleep
procedura, ma la presento come un'opzione concettuale per completezza:
set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%