Come dormire in un file batch?


132

Come mettere in pausa l'esecuzione per un po 'in un file batch di Windows tra un comando e il successivo?


Questo è destinato a diventare un canonico? In tal caso, potrebbe essere appropriato un testo esplicativo.
John Gardeniers,

2
"Testo esplicativo" come in?
Massimo

2
La maggior parte, se non tutte, le domande canoniche che ho visto includono un testo che descrive l'intento di quella domanda.
John Gardeniers,

O un po 'di testo che spiega la situazione ... È principalmente di aiuto con SEO, ma aiuta anche a inquadrare potenziali risposte.
Chris S,

2
SEO funziona bene. Primo colpo per me sulla ricerca di Google.
jbo5112,

Risposte:


194

Il modo corretto di dormire in un file batch è utilizzare il timeoutcomando, 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

6
Il comando timeout non funziona con Windows XP anche con il Resource kit 2003 installato e il comando sleep non funziona in Windows 7, quindi il comando ping può essere comunque utile se si utilizza il file batch su Win7 e WinXP.

12
il timeout non funziona negli script non interattivi: "ERRORE: reindirizzamento input non supportato, uscendo immediatamente dal processo". quindi a volte è preferibile usare l'hack con "ping".
iMysak,

14

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


3
Per favore, non farlo, anche se è leggermente meglio del ping di un indirizzo reale. Pingè semplicemente lo strumento sbagliato per il lavoro.
Massimo

1
@Massimo Probabilmente non è quello che era destinato a fare :) Ma penso che sia ancora una buona soluzione - funziona meglio del timeout in alcuni scenari (in particolare con una risoluzione più elevata). Inoltre, è diventato abbastanza noto, quindi molte persone non sarebbero molto sorprese (cioè confuse) quando lo vedono nel tuo file batch.
Mafu,

2
@Massimo Va bene! Immagino che abbiamo solo opinioni diverse. Se non ti dispiace lascerò comunque questa risposta poiché sembra essere meglio del ping di localhost n volte come è più spesso descritto.
mafu,

7
il timeout è la soluzione giusta per i sistemi operativi su cui funziona. ping è l'unica soluzione che funziona dalla 5.1-6.3. Con il 25% dei sistemi ancora su 5.1, il timeout non è "il modo corretto".
Wyrmwood,

3
il timeout è la soluzione sbagliata per qualsiasi sistema operativo, perché è fatalmente rotto anche in Windows 10. A che serve un comando che fallisce solo perché l'input viene reindirizzato?
Harry Johnston,

8

È 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


6
Ehm ... lo scopo di questo Q / A era esattamente quello di correggere altre due domande che hanno questa come risposta accettata, ma non possono più essere corrette perché il loro PO non è più in circolazione.
Massimo,

6
Mentre funzionerà è l'equivalente di guidare una vite con un martello. Uno strumento sbagliato può funzionare, ma è ancora sbagliato.
voretaq7,

1
@MarkAllen In altre parole, Windows NT4, 95, 98, ME e precedenti?
Chris McKeown,

5
@MarkAllen - tecnicamente devi preoccuparti se il pingtuo sistema operativo è presente o meno . Se sei abbastanza preoccupato per '95 '98 o ME, dovresti essere altrettanto preoccupato per 6.22 che non ha pingneanche
Mark Henderson

4
@MarkHenderson È più facile (per me) ricordare se una particolare versione del sistema operativo supporta TCP / IP piuttosto che ricordare se include o meno un comando che non avevo mai sentito prima. Sai?
Mark Allen,

2

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 timeoutdi 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, CScriptha 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.Sleepprocedura, 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%

Sai ... potresti farlo in PowerShell, mi aspetto, senza dover scrivere un file.
Harry Johnston,

Sì, questa è probabilmente un'altra buona soluzione, anche se credo che questa sia più retrocompatibile con le vecchie versioni di Windows.
BuvinJ,
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.