Wie in der Windows-Eingabeaufforderung für 5 Sekunden schlafen? (oder DOS)


14 Answers

Ich bin sehr überrascht, dass niemand erwähnt hat:

C:\> timeout 5

NB Bitte beachten Sie jedoch (Danke Dan!), Dass timeout 5 bedeutet:

Schlafen Sie zwischen 4 und 5 Sekunden

Dies kann empirisch verifiziert werden, indem das Folgende in eine Batch-Datei geschrieben wird, es wiederholt ausgeführt wird und die Zeitunterschiede zwischen dem ersten und dem zweiten echo berechnet werden:

@echo off
echo %time%
timeout 5 > NUL
echo %time%
Question

Diese Frage hat hier bereits eine Antwort:

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

Also könnte ich in Ruby so etwas tun

sleep 3
system('c:/windows/system32/SnippingTool.exe')

aber nicht jeder Computer hat Ruby, also wie mache ich das in einer .bat-Datei? (etwas, das auf den meisten PCs mit dem Snipping-Tool lauffähig ist).

Das Problem ist, dass in einer BAT-Datei kein "Schlaf" verfügbar ist.




Timeout /t 1 >nul

Ist wie Pause in 1 Sekunde, können Sie die gekalkte zu fast 100.000 (99,999) Sekunden nehmen. Wenn Sie mit dem Internet verbunden sind, wäre die beste Lösung:

ping 1.1.1.1. -n 1 -w 1000 >nul

Wenn Sie pingen, zählen Sie in Millisekunden, also würde eine Sekunde 1000 Millisekunden sein. Aber der Ping-Befehl ist ein wenig zweifelhaft, es funktioniert nicht auf Offline-Rechnern. Das Problem ist, dass die Maschine verwirrt wird, weil sie offline ist und sie eine website/server/host/ip möchte, aber das geht nicht. Also ich würde eine Auszeit empfehlen. Viel Glück!




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

call wait 10

Es hat funktioniert, als ich es getestet habe.

Auflistung von wait.bat (muss sich im Arbeitsverzeichnis 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



Wenn Sie PowerShell auf Ihrem System haben, können Sie einfach diesen Befehl ausführen:

powershell -command "Start-Sleep -s 5"

Bearbeiten: Personen haben ein Problem verursacht, bei dem die Zeit, die Powershell zum Starten benötigt, im Vergleich zu dem Zeitraum, auf den Sie warten möchten, signifikant ist. Wenn die Genauigkeit der Wartezeit wichtig ist (dh eine zweite oder zwei zusätzliche Verzögerung ist nicht akzeptabel), können Sie diesen Ansatz verwenden:

powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

Dies dauert die Zeit, als der Windows-Befehl ausgegeben wurde, und das Powershell-Skript schläft bis 5 Sekunden nach dieser Zeit. So lange Powershell weniger Zeit zum Starten braucht als Ihre Schlafdauer, wird dieser Ansatz funktionieren (es sind ungefähr 600ms auf meinem Rechner).




Ich habe versucht, dies innerhalb einer Msbuild-Aufgabe zu tun, und Auswahl und Timeout funktionierten beide nicht wegen der I / O-Umleitung.

Ich habe schliesslich sleep.exe von http://sourceforge.net/projects/unxutils , was nett ist, weil es keine Installation benötigt und es winzig ist.

Versuche mit der 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.

Mit timeout versuchen:

<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.

Beiseite:

Ich benutze eigentlich <Exec Command="sleep 2 & dbghost.exe" /> weil ich dbghost.exe mehrmals parallel ausführe und temporäre Dateien / Datenbanken basierend auf der aktuellen Epoche in Sekunden erstellt - was natürlich bedeutet, wenn Sie starten mehrere Instanzen, jede verwendet denselben Temp-Namen. Ich habe ursprünglich versucht, MSBuild Extension Pack Thread.Sleep Befehl zu verwenden, aber es scheint, dass (normalerweise) die Sleep-Task fein ausgeführt wurde, aber dann die <exec> Task in allen Threads zur gleichen Zeit und natürlich dbghost zu starten. exe würde mit Konflikten scheitern. Bisher scheint die Verwendung von sleep.exe zuverlässiger zu sein.




Erstellen Sie eine cmd-Datei namens sleep.cmd:

REM Usage: SLEEP Time_in_MiliSECONDS
@ECHO off
ping 1.0.0.0 -n 1 -w %1 > nul

Kopieren Sie sleep.cmd nach c: \ windows \ system32

Verwendung:

sleep 500

Schläft für 0,5 Sekunden. Argumente in ms. Einmal nach System32 kopiert, kann überall verwendet werden.

EDIT: Sie sollten auch weg sein, wenn die Maschine nicht an ein Netzwerk angeschlossen ist (sagen Sie ein tragbares, dass Sie in der U-Bahn verwenden), funktioniert der Ping-Trick nicht mehr wirklich.







Ich habe ein Powerbasic-Programm wait.exe geschrieben , dem Sie in Ihrer Batch-Datei einen Millisekunden-Parameter übergeben

wait 3000
system('c:/windows/system32/SnippingTool.exe')

der Code für die EXE:

FUNCTION PBMAIN()
  c$ = Command$
  s! = Val(c$)*1000
  Sleep s!         
END FUNCTION



rem *** HACK ALERT: Sleep for 5 seconds ***
ping -n 6 127.0.0.1 > nul
rem ***************************************
  • Wie von @Joey erklärt behoben



Dies ist die neueste Version dessen, was ich in der Praxis für eine Pause von zehn Sekunden 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

Das Echo done ermöglicht es mir zu sehen, wann das Skript beendet wurde und der Ping die Verzögerung liefert. Die extra @ -Zeichen bedeuten, dass ich den "fertig" -Text sehe und das Warten stattfindet, ohne dass ich von ihren Befehlen abgelenkt werde.

Ich habe die verschiedenen Lösungen hier auf einer XP-Maschine ausprobiert, da die Idee darin bestand, eine Batch-Datei zu haben, die auf einer Vielzahl von Maschinen laufen würde, und so wählte ich die XP-Maschine als die wahrscheinlich am wenigsten geeignete Umgebung aus.

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

Dies schien wie erwartet eine Verzögerung von drei Sekunden zu geben. Ein Ping-Versuch dauert 3 Sekunden.

BAD> ping -n 5 192.0.2.0 > nul

Dies dauerte ungefähr 10 Sekunden (nicht 5). Meine Erklärung ist, dass es 5 Ping-Versuche gibt, jeweils etwa eine Sekunde auseinander, was 4 Sekunden dauert. Und jeder Ping-Versuch dauerte wahrscheinlich rund eine Sekunde, was insgesamt schätzungsweise 9 Sekunden dauerte.

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 obige auch versucht, nachdem ich gelesen habe, dass Kommentare zu BAT-Dateien hinzugefügt werden können, indem zwei aufeinanderfolgende Doppelpunkte verwendet werden. Die Software kehrte jedoch fast sofort zurück. Setzen Sie den Kommentar auf eine eigene Zeile, bevor der Ping funktioniert.

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

Um besser zu verstehen, was Ping in der Praxis macht, lief ich

ping 192.0.2.0 -n 5 -w 5000

Dies dauerte ungefähr 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 Verzögerung von 1 Sekunde zwischen den Ping-Versuchen: Es gibt schließlich wenig Grund, ein anderes Ergebnis zu erwarten, wenn Sie sofort erneut pingen Vernetzen Sie sich ein wenig, um sich von dem Problem zu erholen, das es hatte.

Edit: gestohlen von einem anderen Beitrag , .. RFC 3330 sagt, die IP-Adresse 192.0.2.0 sollte nicht im Internet erscheinen, so ping diese Adresse verhindert diese Tests spammen jemand! Ich habe den obigen Text entsprechend modifiziert!




Eine Verbesserung des vom Benutzer Aacini vorgeschlagenen Codes, Es hat eine Auflösung von Hundertstelsekunden und scheitert nicht, wenn die Zeit 23: 59: 59,99 erreicht:

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

:: Example delay 1 seg.
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

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



Es kann mit zwei einfachen Zeilen in einer Batch-Datei durchgeführt werden: Schreiben Sie eine temporäre .vbs Datei in den Ordner %temp% und rufen Sie sie auf:

echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
cscript "%temp%\sleep.vbs"



Ich denke der folgende Befehl kann helfen:

pause 5

Die Syntax des Befehls pause lautet: pause d \ \ wobei d die Dauer in Sekunden darstellt

Ich benutze Windows 7 (32 Bit), aber ich weiß nicht über die anderen.




PING -n 60 127.0.0.1>nul

falls Ihr LAN-Adapter nicht verfügbar ist.




Ping wartet für ca. 5 Sekunden vor dem Timeout, nicht 1 Sekunde wie oben angegeben. Das heißt, es sei denn, Sie sagen ihm, dass er nur 1 Sekunde warten soll, bevor er das Timing ausführt.

ping 1.0.0.1 -n 1 -w 1000

Ping einmal, warten Sie nur 1 Sekunde (1000 ms) für eine Antwort, dann Timeout.

Eine Verzögerung von ungefähr 20 Sekunden wäre also:

ping 1.0.0.1 -n 20 -w 1000




Related