Wie pausiere ich die Ausführung in einer Windows-Batchdatei zwischen einem Befehl und dem nächsten?
Wie pausiere ich die Ausführung in einer Windows-Batchdatei zwischen einem Befehl und dem nächsten?
Antworten:
Die richtige Art, in einer Batch-Datei zu schlafen, ist die Verwendung des timeout
in Windows 2000 eingeführten Befehls.
So warten Sie zwischen 29 und 30 Sekunden :
timeout /t 30
Das Timeout würde unterbrochen, wenn der Benutzer eine Taste drückt. Der Befehl akzeptiert jedoch auch den optionalen Schalter /nobreak
, der alles ignoriert, was der Benutzer drücken kann, mit Ausnahme eines expliziten Befehls CTRL-C
:
timeout /t 30 /nobreak
Wenn Sie nicht möchten, dass der Befehl den Countdown auf dem Bildschirm ausgibt, können Sie die Ausgabe umleiten an NUL
:
timeout /t 30 /nobreak > NUL
Da es auch hier gilt, kopiere ich meine Antwort von einer anderen Seite .
Wenn Sie Ping verwenden möchten, gibt es einen besseren Weg. Sie möchten eine Adresse anpingen, die nicht vorhanden ist, damit Sie eine Zeitüberschreitung mit Millisekundengenauigkeit angeben können. Glücklicherweise ist eine solche Adresse in einem Standard (RFC 3330) definiert, und das ist es auch 192.0.2.x
. Dies ist nicht erfunden, es ist wirklich eine Adresse mit dem einzigen Zweck, nicht zu existieren (es ist möglicherweise nicht klar, aber es gilt auch in lokalen Netzwerken):
192.0.2.0/24 - Dieser Block wird als "TEST-NET" zur Verwendung in der Dokumentation und im Beispielcode zugewiesen. Es wird häufig in Verbindung mit Domainnamen example.com oder example.net in der Hersteller- und Protokolldokumentation verwendet. Adressen innerhalb dieses Blocks sollten nicht im öffentlichen Internet erscheinen.
Verwenden Sie, um für 123 Millisekunden zu schlafen ping 192.0.2.1 -n 1 -w 123 >nul
Ping
ist einfach das falsche Werkzeug für den Job.
Sie können auch einen Ping an localhost einfügen. Dies dauert 4 Sekunden (standardmäßig). Es wird von manchen als Kludge angesehen, funktioniert aber trotzdem ganz gut.
Der Befehl:
ping 127.0.0.1
ping
Ihr Betriebssystem mitgeliefert wird oder nicht . Wenn Sie genug über '95 '98 oder ME besorgt sind , dann sollten Sie als gleichermaßen besorgt über 6,22 sein , was nicht hat ping
entweder
Disclaimer : dies ist nicht die „ideale“ Lösung, so nicht die Mühe , mich über den Kopf schlägt mit dieser wie denjenigen getan zu empfehlen ping
...
Verwenden Sie wenn möglich timeout
auf jeden Fall. Wie in den Kommentaren erwähnt, ist dies jedoch nicht immer eine Option (z. B. im nicht interaktiven Modus). Danach stimme ich zu, dass der ping
"Kludge" die nächstbeste Option ist, da er sehr einfach ist. Das heißt, ich biete eine andere Option an ... binde ein paar VB-Skripte ein .
Die Basis dieser Lösung ist darüber hinaus vielseitig einsetzbar. Oft kann VBS Dinge tun, die Batch nicht können, oder zumindest drastisch einfacher. Mit der hier abgebildeten Technik können Sie beides mischen (nicht "nahtlos", sondern "funktional" ...).
Hier ist ein Einzeiler, um ein temporäres Skript zu erstellen, es auszuführen und dann zu löschen. Das Skript erledigt den Ruhezustand für Sie (in diesem Beispiel für 3 Sekunden).
echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs
Hier ist im Grunde das Gleiche, etwas anders geschrieben:
set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%
Und dann schließlich, wie ping
, CScript
selbst hat eine Timeout - Option! Wenn Sie also eine Endlosschleife im Skript eingeben, können Sie den Interpreter die Dauer erzwingen lassen. Beachten Sie, dass dies ein "ausgelasteter" Vorgang ist, der die CPU belastet, und daher empfehle ich ihn nicht, wenn Sie die WScript.Sleep
Prozedur verwenden können, aber der Vollständigkeit halber stelle ich ihn als konzeptionelle Option vor:
set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%