Wenn ich eine Batch-Datei schreibe, um etwas auf einer Windows-Box zu automatisieren, musste ich die Ausführung einige Sekunden lang anhalten (normalerweise in einer Test- / Warteschleife, um auf den Start eines Prozesses zu warten). Zu der Zeit verwendet die beste Lösung, die ich finden konnte, Ping (ich mache dir nichts vor), um den gewünschten Effekt zu erzielen. Ich habe hier eine bessere Beschreibung gefunden , die eine aufrufbare "wait.bat" beschreibt, die wie folgt implementiert ist:
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul
Sie können dann Aufrufe von wait.bat in Ihre eigene Batch-Datei aufnehmen und dabei die Anzahl der Sekunden für den Ruhezustand angeben.
Anscheinend bietet das Windows 2003 Resource Kit (endlich!) Einen Unix-ähnlichen Schlafbefehl . Gibt es in der Zwischenzeit für diejenigen von uns, die noch Windows XP, Windows 2000 oder (leider) Windows NT verwenden , einen besseren Weg?
Ich habe das sleep.py
Skript in der akzeptierten Antwort so geändert , dass es standardmäßig eine Sekunde beträgt, wenn in der Befehlszeile keine Argumente übergeben werden:
import time, sys
time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
quelle
ping
Befehl oder laden Sie das Windows Resource Kit herunter, das einensleep
Befehl enthält. Weitere Details hier: Batch-Datei SLEEP CommandAntworten:
AKTUALISIEREN
Der
timeout
Befehl, der ab Windows Vista verfügbar ist, sollte der verwendete Befehl sein, wie in einer anderen Antwort auf diese Frage beschrieben. Was hier folgt, ist eine alte Antwort.Alte Antwort
Wenn Sie Python installiert haben oder nichts dagegen haben (es hat auch andere Verwendungszwecke :), erstellen Sie einfach das folgende sleep.py- Skript und fügen Sie es irgendwo in Ihren PATH ein:
Es werden Pausen von weniger als einer Sekunde (z. B. 1,5 Sekunden, 0,1 Sekunden usw.) zugelassen, falls Sie dies benötigen. Wenn Sie es als
sleep
und nicht aufrufen möchten,sleep.py
können Sie die.PY
Erweiterung Ihrer Umgebungsvariablen PATHEXT hinzufügen . Unter Windows XP können Sie es bearbeiten in:Arbeitsplatz → Eigenschaften (Menü) → Erweitert (Registerkarte) → Umgebungsvariablen (Schaltfläche) → Systemvariablen (Rahmen)
quelle
Der
timeout
Befehl ist ab Windows Vista verfügbar:Hinweis: Es funktioniert nicht mit der Eingabeumleitung - triviales Beispiel:
quelle
timeout
ist teilweise falsch - Windows XP verfügt nicht über diesen Befehl.Mit der beschriebenen
ping
Methode mache ich das, wenn ich keine weiteren ausführbaren Dateien hinzufügen kann (oder will) oder keine andere Software installieren kann.Sie sollten etwas pingen, das nicht vorhanden ist, und das
-w
Flag verwenden, damit es nach dieser Zeit fehlschlägt, und nicht etwas pingen, das vorhanden ist (wie localhost)-n
. Auf diese Weise können Sie die Zeit in weniger als einer Sekunde verarbeiten, und ich denke, sie ist etwas genauer.z.B
(Test, dass 1.1.1.1 nicht genommen wird)
quelle
PING: transmit failed. General failure.
1.1.1.1
wird von CloudFlare übernommen, sodass dies nicht 15 Sekunden, sondern einige ms dauert.SLEEP.exe
ist in den meisten Resource Kits enthalten, z. B. dem Windows Server 2003 Resource Kit, das auch unter Windows XP installiert werden kann.quelle
Ich bin mit den Antworten, die ich hier gefunden habe, nicht einverstanden.
Ich verwende die folgende Methode, die vollständig auf den Windows XP-Funktionen basiert, um eine Verzögerung in einer Batchdatei auszuführen:
DELAY.BAT:
Sie können den Tag auch in die Berechnung einfügen, damit die Methode auch funktioniert, wenn das Verzögerungsintervall über Mitternacht liegt.
quelle
TIME
Befehl angezeigt werden .%TIME%
ein Komma verwenden, um die Centisekunden anstelle eines Punktes zu trennen!DELIMS=:.,"
Ich hatte ein ähnliches Problem, aber ich habe gerade eine sehr kurze C ++ - Konsolenanwendung aufgerufen, um dasselbe zu tun. Führen Sie einfach MySleep.exe 1000 aus - vielleicht einfacher als das Herunterladen / Installieren des gesamten Resource Kits.
quelle
Drüben bei Server Fault wurde eine ähnliche Frage gestellt , und die Lösung dort war:
quelle
CHOICE
mir bekannten Versionen, wenn jemand während des Wartens einen Knopf drückt, was ungeduldige Leute manchmal tun, registriert die Auswahl eine Eingabe, gibt einen Systemton für eine schlechte Eingabe aus und stoppt den Countdown-Timer, was bedeutet, dass er hängen bleibt dort, es sei denn, sie drücken N oder Y. Und wenn sie zufällig einen dieser beiden drücken, endet die Auswahl genau dort, anstatt auf 5 zu warten. Außerdem verwendet diese Auswahl eine wirklich seltsame Vista-Syntax. Alle normalen Auswahlbefehle würden stattdessen dafür verwendetCHOICE /T:Y,5 > NUL
./D
In den alten Versionen gibt es keine Flagge./C:YN
oder nur anzugeben/C:Y
Dies wird nicht funktionieren, wenn jemand beispielsweise einen schwedischen Auswahlbefehl hat, der wahrscheinlich standardmäßig ein [J, N] ausführt. Das steckt also in allen möglichen Schwierigkeiten.Sie können die Windows- cscript-WSH- Ebene und diese JavaScript-Datei wait.js verwenden:
quelle
Verwenden Sie je nach Ihren Kompatibilitätsanforderungen Folgendes
ping
:zB um 5 Sekunden zu warten, verwenden Sie
oder unter Windows 7 oder höher verwenden
timeout
:quelle
-w
ist in Millisekunden,-n
ist nur die Anzahl der Pings und die Standardzeit zwischen den Pings ist eine Sekunde.Sie können Ping verwenden:
Es wird 10 Sekunden warten.
Der Grund, warum Sie 11 verwenden müssen, ist, dass der erste Ping sofort erlischt und nicht nach einer Sekunde. Die Anzahl sollte immer eins mehr sein als die Anzahl der Sekunden, die Sie warten möchten.
Denken Sie daran, dass der Zweck des
-w
nicht darin besteht, eine Sekunde zu warten. Damit stellen Sie sicher, dass Sie bei Netzwerkproblemen nicht länger als eine Sekunde warten .ping
alleine sendet ein ICMP-Paket pro Sekunde. Es ist wahrscheinlich nicht für localhost erforderlich, aber alte Gewohnheiten sterben schwer.quelle
-w
das Zeitlimit (obwohl ich zugeben kann, dass einige aufgrund meiner Unklarheit darauf schließen können) tatsächlich dazu verwendet wird, die Zykluszeit zu begrenzen, wenn Netzwerkprobleme auftreten, die dazu führen würden, dass jeder Zyklus mehr als die zugewiesene Zeit benötigt zweite. Ich habe am Ende einen Absatz hinzugefügt, um dies zu verdeutlichen.Es gibt eine bessere Möglichkeit, mit Ping zu schlafen. Sie möchten eine Adresse anpingen, die nicht vorhanden ist, damit Sie ein Zeitlimit mit Millisekundengenauigkeit angeben können. Glücklicherweise ist eine solche Adresse in einem Standard (RFC 3330) definiert und ist es auch
192.0.2.x
. Dies ist nicht erfunden, es ist wirklich eine Adresse mit dem alleinigen Zweck, nicht zu existieren (es ist möglicherweise nicht klar, aber es gilt auch in lokalen Netzwerken):Verwenden Sie, um 123 Millisekunden zu schlafen
ping 192.0.2.1 -n 1 -w 123 >nul
quelle
-n
.ping 192.0.2.1
auf diesem Windows-PC aus, und es ist ersichtlich, dass der Windows TCP / IP-Stapel auf die Echoanforderungen antwortet. Wie viele Personen wissen, dass 192.0.2.0/24 nicht für eine statische IPv4-Adresse verwendet werden sollte?127.255.255.255
weil es eine Broadcast - Loopback - Adresse in Windows ist , die bereits standardmäßig zugeordnet ist (Sie können dies bestätigen , indem Sieroute print
in cmd und Durchsuchen der IPv4-Routentabelle, die gedruckt wird).Wenn Sie PowerShell auf Ihrem System haben, können Sie einfach diesen Befehl ausführen:
Bearbeiten: Aus meiner Antwort auf einen ähnlichen Thread haben die Leute ein Problem angesprochen, bei dem die Zeit, die Powershell zum Starten benötigt, im Vergleich zu der Zeit, auf die Sie warten möchten, erheblich ist. Wenn die Genauigkeit der Wartezeit wichtig ist (dh eine zusätzliche Verzögerung von ein oder zwei Sekunden nicht akzeptabel ist), können Sie diesen Ansatz verwenden:
Dies dauert einige Zeit, bis der Windows-Befehl ausgegeben wurde, und das Powershell-Skript wird bis zu 5 Sekunden nach dieser Zeit in den Ruhezustand versetzt. Solange der Start von Powershell weniger Zeit in Anspruch nimmt als Ihre Schlafdauer, funktioniert dieser Ansatz (auf meinem Computer sind es ungefähr 600 ms).
quelle
So führen Sie das Skript beispielsweise zu einer unterbrechungsfreien Wartezeit von 2 Sekunden:
Das heißt, das Skript wartet 2 Sekunden, bevor es fortfährt.
Standardmäßig unterbricht ein Tastendruck das Zeitlimit. Verwenden
/nobreak
Sie daher den Schalter, wenn der Benutzer das Warten nicht unterbrechen (abbrechen) soll. Darüber hinaus werden durch das Zeitlimit Benachrichtigungen pro Sekunde bereitgestellt, um den Benutzer darüber zu informieren, wie lange noch gewartet werden muss. Dies kann durch Weiterleiten des Befehls an entfernt werdenNUL
.Bearbeiten: Wie @martineau in den Kommentaren ausführt , ist der
timeout
Befehl nur unter Windows 7 und höher verfügbar. Darüber hinaus benötigt derping
Befehl weniger Prozessorzeit alstimeout
. Ich glaube jedoch immer noch darantimeout
, wenn möglich zu verwenden, da es besser lesbar ist als derping
"Hack". Lesen Sie hier mehr .quelle
ping
Ansatz weniger Prozessorzeit benötigt.Fügen Sie dies einfach in Ihre Batch-Datei ein, wo Sie warten möchten.
quelle
Schreiben Sie im Editor:
Speichern Sie nun als wait.bat im Ordner C: \ WINDOWS \ System32. Verwenden Sie dann, wann immer Sie warten möchten:
quelle
ping
nicht nur einmal etwas zu tun und die-w Timeout
Option für die Verzögerungszeit in Millisekunden zu verwenden, als die Option für die-n Count
gesamte Anzahl der Wiederholungen.-w Timeout
mag besser sein, aber ich habe dafür gesorgt, dass es noch einmal pingt als die eingegebene Zeit.Das Resource Kit hat dies immer enthalten. Zumindest seit Windows 2000.
Außerdem hat das Cygwin-Paket einen
sleep
- Plop, der in Ihren PFAD einfügt und dencygwin.dll
(oder wie auch immer er heißt) und den Weg vor sich hat!quelle
Ich mag Aacinis Antwort . Ich habe es hinzugefügt, um den Tag zu verarbeiten und es auch für Centisekunden (
%TIME%
AusgabenH:MM:SS.CC
) zu aktivieren :quelle
Ich habe dieses C # -Schlafprogramm verwendet. Es ist möglicherweise bequemer für Sie, wenn C # Ihre bevorzugte Sprache ist:
quelle
Noch leichter als die Python-Lösung ist ein Perl-Einzeiler.
Um sieben Sekunden lang zu schlafen, geben Sie dies in das BAT-Skript ein:
Diese Lösung bietet nur eine Auflösung von einer Sekunde.
Wenn Sie eine höhere Auflösung benötigen, verwenden Sie das Time :: HiRes-Modul von CPAN. Es gibt an,
usleep()
welche in Mikrosekunden undnanosleep()
welche in Nanosekunden schlafen (beide Funktionen akzeptieren nur ganzzahlige Argumente). Siehe die Frage zum Stapelüberlauf. Wie schlafe ich eine Millisekunde in Perl? für weitere Details.Ich benutze ActivePerl seit vielen Jahren. Es ist sehr einfach zu installieren.
quelle
Oder Befehlszeilen-Python zum Beispiel für 6 ½ Sekunden:
quelle
Die Verwendung von Ping ist gut, solange Sie nur "ein bisschen warten" möchten. Dies liegt daran, dass Sie von anderen Funktionen abhängig sind, z. B. der Funktionsweise Ihres Netzwerks und der Tatsache, dass auf 127.0.0.1 keine Antwort erfolgt. ;-) Vielleicht ist es nicht sehr wahrscheinlich, dass es fehlschlägt, aber es ist nicht unmöglich ...
Wenn Sie sicher sein möchten, dass Sie genau auf die angegebene Zeit warten, sollten Sie die verwenden
sleep
Funktionalität verwenden (die auch den Vorteil hat, dass sie keine CPU-Leistung verbraucht oder darauf wartet, dass ein Netzwerk bereit ist).Am bequemsten ist es, eine bereits für den Schlaf erstellte ausführbare Datei zu finden. Legen Sie es einfach in Ihrem Windows-Ordner oder einem anderen Teil Ihres Standardpfads ab und es ist immer verfügbar.
Wenn Sie eine Kompilierungsumgebung haben, können Sie diese auch einfach selbst erstellen. Die
Sleep
Funktion ist in verfügbarkernel32.dll
, Sie müssen sie also nur verwenden. :-) Für VB / VBA deklarieren Sie am Anfang Ihrer Quelle Folgendes, um eine Schlaffunktion zu deklarieren:Für C #:
Weitere Informationen zu dieser Funktionalität (verfügbar seit Windows 2000) finden Sie hier in der Funktion "Ruhezustand" (MSDN).
In Standard C
sleep()
ist in der Standardbibliothek enthalten, und in Microsoft Visual Studio C wird die Funktion benanntSleep()
, wenn der Speicher mir dient. ;-) Diese beiden nehmen das Argument in Sekunden, nicht in Millisekunden wie die beiden vorherigen Erklärungen.quelle
Die beste Lösung, die nach Windows 2000 auf allen Windows-Versionen funktionieren sollte, wäre:
quelle
'timeout' is not recognized as an internal or external command, operable program or batch file.
Die pathping.exe kann weniger als eine Sekunde schlafen.
.
quelle
Ich bin beeindruckt von diesem:
http://www.computerhope.com/batch.htm#02
Technisch gesehen weisen Sie den
choice
Befehl an, nur y zu akzeptieren. Der Standardwert ist y, um dies in 5 Sekunden zu tun, keine Eingabeaufforderung zu zeichnen und alles zu sichern, was es NUL sagt (wie Null-Terminal unter Linux).quelle
CHOICE
mir bekannten Versionen wird, wenn jemand während des Wartens eine Taste drückt, was manchmal ungeduldige Leute tun, die Auswahl eine Eingabe lesen, einen Systemton für eine schlechte Eingabe geben und den Countdown anhalten, sodass er hängen bleibt, es sei denn, sie drücken Y. Und wenn sie zufällig Y drücken, endet die Auswahl genau dort, anstatt auf 5 zu warten. Außerdem verwendet diese Auswahl eine wirklich seltsame Vista-Syntax. Die normalen Auswahlbefehle verwenden stattdessenCHOICE /T:Y,5 > NUL
dafür. (In den alten Versionen gibt es kein / D-Flag.) Wenn Sie Vista haben, verwenden SieTIMEOUT
stattdessen.Sie können auch eine .vbs-Datei verwenden, um bestimmte Zeitüberschreitungen durchzuführen:
Der folgende Code erstellt die .vbs-Datei. Fügen Sie dies oben in Ihren Rbatch-Code ein:
Der folgende Code öffnet dann die .vbs und gibt an, wie lange gewartet werden soll:
Im obigen Code ist "1000" der Wert der Zeitverzögerung, die in Millisekunden an die .vbs-Datei gesendet werden soll, z. B. 1000 ms = 1 s. Sie können diesen Teil so lange ändern, wie Sie möchten.
Der folgende Code löscht die .vbs-Datei, nachdem Sie damit fertig sind. Fügen Sie dies am Ende Ihrer Batch-Datei ein:
Und hier ist der Code zusammen, damit er leicht kopiert werden kann:
quelle
Von Windows Vista auf Sie haben TIMEOUT und SLEEP - Befehle, aber sie unter Windows XP oder Windows Server 2003 zu verwenden, müssen Sie den benötigen Windows Server 2003 Ressource - Tool - Kit .
Hier haben Sie einen guten Überblick über Schlafalternativen (der Ping-Ansatz ist der beliebteste, da er auf jedem Windows-Computer funktioniert), aber es gibt (mindestens) einen nicht erwähnten, der (ab) den
W32TM
Befehl (Zeitdienst) verwendet :Wo Sie das N durch die Sekunden ersetzen sollten, die Sie anhalten möchten. Außerdem funktioniert es auf jedem Windows-System ohne Voraussetzungen.
Typeperf kann auch verwendet werden:
Mit mshta und Javascript (kann für den Schlaf unter einer Sekunde verwendet werden):
Dies sollte noch genauer sein (um weniger als eine Sekunde zu warten) - selbstkompilierende ausführbare Datei, die sich auf Folgendes stützt
.net
:quelle
Es gibt viele Möglichkeiten, einen " Schlaf " in cmd / batch zu erreichen:
Mein Liebling:
Dadurch wird die Konsole für 5 Sekunden ohne Ausgabe angehalten.
Am meisten benutzt:
Dadurch wird versucht, eine Verbindung zu
localhost
5 Mal herzustellen . Da es auf Ihrem Computer gehostet wird, erreicht es immer den Host, sodass es jede Sekunde das Neue jede Sekunde ausprobiert. Das-n
Flag gibt an, wie oft das Skript die Verbindung versucht. In diesem Fall ist es 5, es dauert also 5 Sekunden.Varianten des letzten:
In diesem Skript gibt es einige Unterschiede im Vergleich zum letzten. Dies wird nicht versuchen anzurufen
localhost
. Stattdessen wird versucht, eine Verbindung zu1.1.1.1
einer sehr schnellen Website herzustellen. Die Aktion dauert nur 5 Sekunden , wenn Sie eine aktive Internetverbindung haben. Andernfalls dauert es ungefähr 15, um die Aktion abzuschließen . Ich empfehle diese Methode nicht.Dies ist genau das gleiche wie in Beispiel 2 (am häufigsten verwendet). Sie können auch Folgendes verwenden:
Dies verwendet stattdessen die IPv6-
localhost
Version.Es gibt viele Methoden, um diese Aktion auszuführen. Ich bevorzuge jedoch Methode 1 für Windows Vista und spätere Versionen und die am häufigsten verwendete Methode (Methode 2) für frühere Versionen des Betriebssystems.
quelle
Sie können sich etwas einfallen lassen, indem Sie die PAUSE-Nachricht in die Titelleiste einfügen:
quelle
Dies wurde unter Windows XP SP3 und Windows 7 getestet und verwendet CScript. Ich habe einige sichere Wachen eingesetzt, um eine Aufforderung zu vermeiden. (
/q
wäre gefährlich)Warte eine Sekunde:
Warten Sie 500 ms und führen Sie dann die folgenden Schritte aus:
sleepOrDelayExecution.bat:
quelle
Da andere Programme von Drittanbietern vorschlagen (Python, Perl, benutzerdefinierte App usw.), ist GNU CoreUtils für Windows eine weitere Option, die unter http://gnuwin32.sourceforge.net/packages/coreutils.htm verfügbar ist .
2 Optionen für die Bereitstellung:
Ein Vorteil der Bereitstellung von CoreUtils besteht darin, dass Sie zusätzlich eine Vielzahl anderer Programme erhalten, die für die Skripterstellung hilfreich sind (Windows-Batch lässt zu wünschen übrig).
quelle