870 Stimmen

Wie man in einer Batch-Datei/cmd fünf Sekunden lang schlafen kann

Das Snipping-Tool von Windows kann den Bildschirm erfassen, aber manchmal möchte ich den Bildschirm nach fünf Sekunden erfassen, z. B. um ein Bild aufzunehmen, das von der Webcam angezeigt wird (führen Sie das Skript aus und lächeln Sie in die Kamera, zum Beispiel).

Wie kann ich in einer Batch-Datei 5 Sekunden lang schlafen?

27 Stimmen

Kurze Antwort für alle, die hier landen: Seit Windows Vista gibt es eine native Lösung: TIMEOUT . Verweise: SS64 , Rob van der Woude .

3 Stimmen

Es gibt Timeout Befehl, der sekundenlang wartet. Falls ein Millisekunden-Schlaf benötigt wird, kann der Powershell-Befehl Start-Schlaf verwendet werden können. Um 50ms in cmd zu schlafen: powershell Start-Sleep -m 50

0 Stimmen

@Pavel: Man kann auch einen Ping an einen nicht existierenden Host missbrauchen, um für Millisekunden zu schlafen.

19voto

Ned Martin Punkte 456

Zwei Antworten:

Erstens, die Verzögerung in einer Stapeldatei, einfach ohne all die stumpfen Methoden, die die Leute vorgeschlagen haben:

timeout /t <TimeoutInSeconds> [/nobreak] 

http://technet.microsoft.com/en-us/library/cc754891.aspx

Zweitens ist es erwähnenswert, dass es zwar nicht genau das tut, was Sie wollen, aber mit dem eingebauten Windows-Beschneidungswerkzeug können Sie eine Beschneidung auslösen, ohne die Maus zu benutzen. Starten Sie das Snipping-Tool, verlassen Sie den aktuellen Snip, aber lassen Sie das Tool laufen, und drücken Sie Strg + Bildschirm drucken, wenn Sie den Snip auslösen möchten. Dies sollte nicht mit dem, was Sie gerade ausschneiden wollen, kollidieren.

16voto

gregmac Punkte 23263

Ich habe versucht, dies aus einem msbuild-Task heraus zu tun, und sowohl choice als auch timeout haben aufgrund der E/A-Umleitung nicht funktioniert.

Ich benutzte schließlich sleep.exe von http://sourceforge.net/projects/unxutils Das ist gut, denn es muss nicht installiert werden und ist winzig.


Versuchen mit choice :

<Target Name="TestCmd">
  <Exec Command="choice /C YN /D Y /t 5 " />
</Target>

Ergebnisse in:

TestCmd:
  choice /C YN /D Y /t 5

EXEC : error : The file is either empty or does not contain the valid choices. [test.proj]
  [Y,N]?
C:\test.proj(5,9): error MSB3073: The command "choice /C YN /D Y /t 5 " exited with code 255.

Versuchen mit timeout :

<Target Name="TestCmd">
  <Exec Command="timeout /t 5 " />
</Target>

Ergebnisse in:

TestCmd:
  timeout /t 5
EXEC : error : Input redirection is not supported, exiting the process immediately. [test.proj]
C:\test.proj(5,7): error MSB3073: The command "timeout /t 5 " exited with code 1.

Nebenbei bemerkt:

Ich verwende derzeit <Exec Command="sleep 2 & dbghost.exe" /> weil ich dbghost.exe mehrere Male parallel ausführe und es temporäre Dateien/Datenbanken auf der Grundlage der aktuellen Epochenzeit in Sekunden erstellt - was natürlich bedeutet, dass, wenn Sie mehrere Instanzen starten, jede denselben temporären Namen verwendet. Ursprünglich hatte ich versucht, MSBuild Extension Pack zu verwenden. Thread.Sleep Befehl, aber es scheint, dass (normalerweise) der Sleep-Task gut ausgeführt wurde, aber dann wurde der <exec> Aufgabe in allen Threads gleichzeitig auszuführen, und natürlich würde dbghost.exe bei Konflikten fehlschlagen. Bisher scheint die Verwendung von sleep.exe zuverlässiger zu sein.

13voto

npocmaka Punkte 52753

Zwei weitere Möglichkeiten, die auf allen Systemen ab XP und höher funktionieren sollten:

mit w32tm :

w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2  1>nul 

mit typeperf :

typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul

mit mshta (erfordert keine Einrichtung des Netzes):

start "" /w /b /min mshta "javascript:setTimeout(function(){close();},5000);"

9voto

Ivan Punkte 3867

Dies ist die neueste Version dessen, was ich in der Praxis für eine zehnsekündige Pause verwende, um die Ausgabe zu sehen, wenn ein Skript beendet ist.

BEST>@echo done
BEST>@set DelayInSeconds=10
BEST>@rem Use ping to wait
BEST>@ping 192.0.2.0 -n 1 -w %DelayInSeconds%000 > nul

Mit echo done kann ich sehen, wann das Skript beendet ist, und mit ping kann ich die Verzögerung feststellen. Die zusätzlichen @-Zeichen bedeuten, dass ich den "done"-Text sehe und die Wartezeit ohne Ablenkung durch ihre Befehle abläuft.

Ich habe die verschiedenen hier vorgestellten Lösungen auf einem XP-Rechner ausprobiert, da ich eine Batch-Datei haben wollte, die auf verschiedenen Rechnern läuft, und deshalb habe ich den XP-Rechner als die Umgebung gewählt, die am wenigsten leistungsfähig ist.

GOOD> ping 192.0.2.0 -n 1 -w 3000 > nul

Dies führte erwartungsgemäß zu einer Verzögerung von drei Sekunden. Ein Ping-Versuch dauert 3 Sekunden.

BAD> ping -n 5 192.0.2.0 > nul

Dies dauerte etwa 10 Sekunden (nicht 5). Meine Erklärung ist, dass es 5 Ping-Versuche gibt, die jeweils etwa eine Sekunde auseinander liegen, also 4 Sekunden. Und jeder Ping-Versuch dauerte wahrscheinlich etwa eine Sekunde, also insgesamt 9 Sekunden.

BAD> timeout 5
BAD> sleep /w2000
BAD> waitfor /T 180
BAD> choice

Befehle nicht verfügbar.

BAD> ping 192.0.2.0 -n 1 -w 10000 > nul :: wait 10000 milliseconds, ie 10 secs

Ich habe das auch versucht, nachdem ich gelesen hatte, dass man Kommentare zu BAT-Dateien durch zwei aufeinanderfolgende Doppelpunkte hinzufügen kann. Die Software kehrte jedoch fast augenblicklich zurück. Wenn ich den Kommentar in eine eigene Zeile vor dem Ping einfüge, klappt es.

GOOD> :: wait 10000 milliseconds, ie 10 secs
GOOD> ping 192.0.2.0 -n 1 -w 10000 > nul

Um besser zu verstehen, wie ping in der Praxis funktioniert, habe ich

ping 192.0.2.0 -n 5 -w 5000

Dies dauerte etwa 30 Sekunden, obwohl 5*5=25. Meine Erklärung ist, dass es 5 Ping-Versuche gibt, die jeweils 5 Sekunden dauern, aber es gibt eine Zeitverzögerung von etwa 1 Sekunde zwischen den Ping-Versuchen: Es gibt schließlich wenig Grund, ein anderes Ergebnis zu erwarten, wenn man sofort wieder anpingt, und es ist besser, einem Netzwerk etwas Zeit zu geben, um sich von dem Problem zu erholen, das es hatte.

Bearbeiten: gestohlen von weiterer Beitrag , .. RFC 3330 sagt, dass die IP-Adresse 192.0.2.0 nicht im Internet auftauchen sollte, so dass das Anpingen dieser Adresse verhindert, dass diese Tests jemanden spammen! Ich habe den obigen Text entsprechend geändert!

6voto

user1884308 Punkte 61

Ich habe das gemacht. Es funktioniert und zeigt die verbleibende Zeit in Sekunden an. Wenn Sie es verwenden möchten, fügen Sie zu einer Batch-Datei:

call wait 10

Als ich es getestet habe, hat es funktioniert.

Auflistung von wait.bat (es muss sich im Arbeitsverzeichnis befinden oder windir/system32/ ):

@echo off

set SW=00

set SW2=00

set /a Sec=%1-1

set il=00
@echo Wait %1 second
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC, SW=CC 

set /a TFIN=%TBASE%+%100

:ESPERAR
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, 

CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC,  SW2=CC

if %SW2% neq %SW% goto notype
if %il%==0 (echo Left %Sec% second & set /a Sec=sec-1 & set /a il=il+1)
goto no0
:notype
set /a il=0
:no0

if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL%
if %TACTUAL% lss %TFIN% goto ESPERAR

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X