it-swarm.com.de

So schlafen Sie fünf Sekunden lang in einer Batch-Datei / cmd

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

Wie schlafe ich 5 Sekunden in einer Batch-Datei?

640

Ein Hack besteht darin, den Ping-Befehl (falsch) zu verwenden:

ping 127.0.0.1 -n 6 > nul

Erläuterung:

  • ping ist ein Systemdienstprogramm, das Ping-Anforderungen sendet. ping ist in allen Windows-Versionen verfügbar.
  • 127.0.0.1 ist die IP-Adresse von localhost . Es wird garantiert, dass diese IP-Adresse immer aufgelöst wird, erreichbar ist und sofort auf Pings reagiert.
  • -n 6 gibt an, dass es 6 Pings geben soll. Zwischen jedem Ping liegt eine Verzögerung von 1 Sekunde. Für eine Verzögerung von 5 Sekunden müssen Sie also 6 Pings senden.
  • > nul unterdrückt die Ausgabe von ping, indem mleitend zu nul .
795
Martin

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

C:\> timeout 5

N.B. Bitte beachte jedoch (danke Dan!), Dass timeout 5 bedeutet:

Schlaf irgendwo zwischen 4 und 5 Sekunden

Dies kann empirisch überprüft werden, indem Folgendes in eine Batchdatei geschrieben, wiederholt ausgeführt und die Zeitdifferenzen zwischen dem ersten und dem zweiten echo berechnet werden:

@echo off
echo %time%
timeout 5 > NUL
echo %time%
1356
asveikau

Versuchen Sie es mit dem Befehl Auswahl . Es gibt es seit MSDOS 6.0 und es sollte den Trick machen.

Verwenden Sie den Parameter/T, um das Zeitlimit in Sekunden anzugeben, und den Parameter/D, um die Standardauswahl anzugeben und die dann ausgewählte Auswahl zu ignorieren.

Das einzige Problem kann sein, dass der Benutzer vor Ablauf des Zeitlimits eines der ausgewählten Zeichen eingibt. Eine teilweise Problemumgehung besteht darin, die Situation zu verschleiern. Verwenden Sie das Argument/N, um die Liste der gültigen Auswahlmöglichkeiten auszublenden, und geben Sie in der Auswahlliste nur 1 Zeichen ein, damit der Benutzer mit geringerer Wahrscheinlichkeit eine gültige Auswahl vor dem ein Timeout läuft ab.

Unten finden Sie den Hilfetext zu Windows Vista. Ich denke, es ist dasselbe auf XP, aber schauen Sie sich den Hilfetext auf einem XP Computer an, um dies zu überprüfen.

C:\>CHOICE /?

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

Description:
    This tool allows users to select one item from a list
    of choices and returns the index of the selected choice.

Parameter List:
   /C    choices       Specifies the list of choices to be created.
                       Default list is "YN".

   /N                  Hides the list of choices in the Prompt.
                       The message before the Prompt is displayed
                       and the choices are still enabled.

   /CS                 Enables case-sensitive choices to be selected.
                       By default, the utility is case-insensitive.

   /T    timeout       The number of seconds to pause before a default
                       choice is made. Acceptable values are from 0 to
                       9999. If 0 is specified, there will be no pause
                       and the default choice is selected.

   /D    choice        Specifies the default choice after nnnn seconds.
                       Character must be in the set of choices specified
                       by /C option and must also specify nnnn with /T.

   /M    text          Specifies the message to be displayed before
                       the Prompt. If not specified, the utility
                       displays only a Prompt.

   /?                  Displays this help message.

   NOTE:
   The ERRORLEVEL environment variable is set to the index of the
   key that was selected from the set of choices. The first choice
   listed returns a value of 1, the second a value of 2, and so on.
   If the user presses a key that is not a valid choice, the tool
   sounds a warning beep. If tool detects an error condition,
   it returns an ERRORLEVEL value of 255. If the user presses
   CTRL+BREAK or CTRL+C, the tool returns an ERRORLEVEL value
   of 0. When you use ERRORLEVEL parameters in a batch program, list
   them in decreasing order.

Examples:
   CHOICE /?
   CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
   CHOICE /T 10 /C ync /CS /D y
   CHOICE /C ab /M "Select a for option 1 and b for option 2."
   CHOICE /C ab /N /M "Select a for option 1 and b for option 2."
68
Adam Porad

Der folgende Hack lässt Sie 5 Sekunden schlafen

ping -n 6 127.0.0.1 > nul

Da Ping eine Sekunde zwischen den Pings wartet, müssen Sie einen Ping mehr angeben, als Sie benötigen.

51
noctonura

Du kannst es mit timeout schaffen:

Dies wird sichtbar sein: timeout 5

Dies wird nicht sichtbar sein timeout 5 >nul

38
Alex

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

powershell -command "Start-Sleep -s 5"

Bearbeiten: Es wurde ein Problem angesprochen, bei dem die Zeit, die Powershell benötigt, um zu starten, im Vergleich zu der Zeit, auf die Sie warten möchten, erheblich ist. Wenn die Genauigkeit der Wartezeit wichtig ist (dh eine oder zwei Sekunden zusätzliche Verzögerung sind 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 nimmt die Zeit in Anspruch, in der der Windows-Befehl ausgegeben wurde, und das Powershell-Skript bleibt bis zu 5 Sekunden nach dieser Zeit inaktiv. Solange der Start von Powershell kürzer ist als die Schlafdauer, funktioniert dieser Ansatz (auf meinem Computer sind es ungefähr 600 ms).

37

Können wir nicht waitfor /T 180 machen?

waitfor /T 180 pause führt zu "FEHLER: Wartezeit auf 'Pause' abgelaufen."

waitfor /T 180 pause >nul wird diesen "Fehler" unter den Teppich kehren

Der Befehl waitfor sollte unter Windows nach Win95 vorhanden sein

In der Vergangenheit habe ich eine ausführbare Datei namens sleep heruntergeladen, die in der Befehlszeile funktioniert, nachdem Sie sie in den Pfad eingefügt haben.

Zum Beispiel: sleep shutdown -r -f /m \\yourmachine, obwohl beim Herunterfahren jetzt die Option -t eingebaut ist

29
joe li

Timeout /t 1 >nul

Ist wie eine Pause in 1 Sekunde, kann man den Lim auf fast 100.000 (99.999) Sekunden bringen. Wenn Sie mit dem Internet verbunden sind, ist die beste Lösung:

ping 1.1.1.1. -n 1 -w 1000 >nul

Wenn Sie pingen, zählen Sie in Millisekunden, also wäre eine Sekunde 1000 Millisekunden. Der Ping-Befehl ist jedoch etwas zweifelhaft und funktioniert auf Offline-Computern nicht auf die gleiche Weise. Das Problem ist, dass der Computer verwirrt wird, weil er offline ist und einen website/server/Host/ip senden möchte, dies jedoch nicht kann. Also würde ich Timeout empfehlen. Viel Glück!

23
Jonathan

SLEEP 5 wurde in einige Windows Resource Kits aufgenommen.

TIMEOUT 5 war in einigen Windows Resource Kits enthalten, ist aber jetzt ein Standardbefehl in Windows 7 und 8 (bei Vista nicht sicher).

PING 1.1.1.1 -n 1 -w 5000 >NUL Für jede MS-DOS- oder Windows-Version mit einem TCP/IP-Client kann PING verwendet werden, um die Ausführung um einige Sekunden zu verzögern.

NETSH badcommand (nur Windows XP/Server 2003) oder CHOICE

Dieser Link wird Ihnen mehr helfen .

20
Amir

Zwei Antworten:

Erstens, um eine Batch-Datei zu verzögern, 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 zu erwähnen, dass mit dem eingebauten Windows-Snipping-Tool möglicherweise nicht genau das getan wird, was Sie möchten, aber Sie können einen Snip darauf auslösen, ohne die Maus zu verwenden. Führen Sie das Snipping-Tool aus, verlassen Sie das aktuelle Snip, lassen Sie das Tool jedoch ausgeführt, und drücken Sie Strg + Druck, wenn das Snip ausgeführt werden soll. Dies sollte nicht stören, was auch immer Sie versuchen zu schnipsen.

12
Ned Martin

Ich habe versucht, dies aus einer msbuild-Task heraus zu tun, und Auswahl und Zeitüberschreitung funktionierten aufgrund der E/A-Umleitung nicht.

Am Ende habe ich sleep.exe von http://sourceforge.net/projects/unxutils verwendet, was gut ist, weil es keine Installation erfordert und winzig ist.


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

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

Beiseite:

Eigentlich verwende ich <Exec Command="sleep 2 & dbghost.exe" />, weil ich dbghost.exe mehrere Male parallel ausführe und temporäre Dateien/Datenbanken basierend auf der aktuellen Epochenzeit in Sekunden erstelle. Wenn Sie also mehrere Instanzen starten, verwendet jede Instanz dieselbe temporärer Name. Ursprünglich habe ich versucht, den Befehl MSBuild Extension Pack Thread.Sleep zu verwenden, aber es scheint, dass (normalerweise) die Sleep-Task einwandfrei ausgeführt wurde, aber dann die Task <exec> in allen Threads gleichzeitig gestartet wurde, und Natürlich würde dbghost.exe mit Konflikten scheitern. Bisher scheint die Verwendung von sleep.exe zuverlässiger zu sein.

11
gregmac

Dies ist die neueste Version von dem, 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

Anhand des Echos kann ich sehen, wann das Skript beendet ist und der Ping die Verzögerung angibt. Die zusätzlichen @ -Zeichen bedeuten, dass ich den "erledigten" Text sehe und das Warten erfolgt, ohne dass ich von ihren Befehlen abgelenkt werde.

Ich habe die verschiedenen hier angegebenen Lösungen auf einer XP Maschine ausprobiert, da die Idee war, eine Batch-Datei zu haben, die auf einer Vielzahl von Maschinen ausgeführt werden kann, und deshalb habe ich mich für die XP Maschine entschieden als die Umgebung wahrscheinlich am wenigsten fähig.

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

Dies schien eine Verzögerung von drei Sekunden zu geben, wie erwartet. 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 im Abstand von jeweils etwa einer Sekunde gibt, was 4 Sekunden ergibt. Und jeder Ping-Versuch dauerte ungefähr eine Sekunde, was geschätzte 9 Sekunden insgesamt ergibt.

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

Nachdem ich gelesen hatte, dass Kommentare mit zwei aufeinander folgenden Doppelpunkten zu BAT-Dateien hinzugefügt werden können, habe ich auch das oben Gesagte versucht. Die Software kehrte jedoch fast sofort zurück. Den Kommentar in eine eigene Zeile zu setzen, 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, bin ich gelaufen

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. Zwischen den Ping-Versuchen liegt jedoch eine Verzögerung von etwa 1 Sekunde. Es gibt schließlich keinen Grund, ein anderes Ergebnis zu erwarten, wenn Sie sofort erneut pingen und es besser ist, a zu geben Netzwerk ein wenig Zeit, um sich von dem Problem zu erholen, das es hatte.

Bearbeiten: gestohlen von ein anderer Beitrag , .. RFC 33 sagt, dass die IP-Adresse 192.0.2.0 nicht im Internet angezeigt werden sollte, so dass das Pingen dieser Adresse verhindert, dass diese Tests jemanden spammen! Ich habe den obigen Text entsprechend geändert!

6
Ivan

zwei weitere Möglichkeiten, die für alles 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
6
npocmaka

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

call wait 10

Es hat funktioniert, als ich es getestet habe.

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

@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
5
user1884308

Sie können VBScript verwenden, zum Beispiel die Datei myscript.vbs:

set wsobject = wscript.createobject("wscript.Shell")

do while 1=1
    wsobject.run "SnippingTool.exe",0,TRUE
    wscript.sleep 3000
loop

Batch-Datei:

cscript myscript.vbs %1
4
Dani

Eine Verbesserung des vom Benutzer Aacini vorgeschlagenen Codes. Er hat eine Auflösung von Hundertstelsekunden und schlägt nicht fehl, 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
3
Rober

Dies kann mit zwei einfachen Zeilen in einer Batch-Datei erfolgen: Schreiben Sie eine temporäre .vbs -Datei in den Ordner %temp% und rufen Sie diese auf:

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

Am einfachsten habe ich es gemacht:

Laden Sie die Sleep.exe unter http://www.sleepcmd.com/ herunter. Die .exe-Datei sollte sich im selben Ordner wie das Programm befinden, das Sie geschrieben haben!

3
Xavi

Ich verwende die folgende Methode, die vollständig auf Windows XP-Funktionen basiert, um eine Verzögerung in einer Stapeldatei durchzuführen:

Datei DELAY.BAT

@ECHO OFF
REM DELAY seconds

REM GET ENDING SECOND
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100,     S=1%%C%%100, ENDING=(H*60+M)*60+S+%1

REM WAIT FOR SUCH A SECOND
:WAIT
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S
IF %CURRENT% LSS %ENDING% GOTO WAIT

Sie können auch den Tag in die Berechnung einfügen, damit die Methode auch funktioniert, wenn das Verzögerungsintervall über Mitternacht liegt.

3
Aacini
PING -n 60 127.0.0.1>nul

falls Ihr LAN-Adapter nicht verfügbar ist.

2
user3584216

Wenn Sie über eine geeignete Version von Windows und die Windows Server 2003 Resource Kit-Tools verfügen, enthält diese einen Befehl für den Ruhezustand für Stapelverarbeitungsprogramme. Mehr unter: http://malektips.com/xp_dos_0002.html

2
GreenMatt

Erstellen Sie eine cmd-Datei mit dem Namen 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

Verwendungszweck:

sleep 500

Schläft für 0,5 Sekunden. Argumente in ms. Nach dem Kopieren in System32 kann es überall verwendet werden.

BEARBEITEN: Sie sollten auch nicht wissen, dass der Ping-Trick nicht mehr funktioniert, wenn der Computer nicht mit einem Netzwerk verbunden ist (z. B. ein tragbares Gerät, das Sie in der U-Bahn verwenden).

1
thebunnyrules

In Windows XP SP3 können Sie den Befehl sleep verwenden

1
Andres

ping wartet ungefähr 5 Sekunden, bevor die Zeit abgelaufen ist, nicht 1 Sekunde wie oben angegeben. Das heißt, es sei denn, Sie sagen , dass Sie nur 1 Sekunde warten sollen, bevor das Zeitlimit überschritten wird.

ping 1.0.0.1 -n 1 -w 1000

wird einmal pingen, nur 1 Sekunde (1000 ms) auf eine Antwort warten, dann Timeout.

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

ping 1.0.0.1 -n 20 -w 1000

0
LionelGoulet

Nun, das funktioniert, wenn Sie die Wahl haben oder Ping.

@echo off
echo.
if "%1"=="" goto askq
if "%1"=="/?" goto help
if /i "%1"=="/h" goto help
if %1 GTR 0 if %1 LEQ 9999 if /i "%2"=="/q" set ans1=%1& goto quiet
if %1 GTR 0 if %1 LEQ 9999 set ans1=%1& goto breakout
if %1 LEQ 0 echo %1 is not a valid number & goto help
if not "%1"=="" echo.&echo "%1" is a bad parameter & goto help
goto end

:help
echo SLEEP runs interactively (by itself) or with parameters (sleep # /q )
echo where # is in seconds, ranges from 1 - 9999
echo Use optional parameter /q to suppress standard output 
echo or type /h or /? for this help file
echo.
goto end

:askq
set /p ans1=How many seconds to sleep? ^<1-9999^> 
echo.
if "%ans1%"=="" goto askq
if %ans1% GTR 0 if %ans1% LEQ 9999 goto breakout
goto askq

:quiet
choice /n /t %ans1% /d n > nul
if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul
goto end

:breakout
choice /n /t %ans1% /d n > nul
if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul
echo Slept %ans1% second^(s^)
echo.

:end

nennen Sie es einfach sleep.cmd oder sleep.bat und führen Sie es aus

0
Doctor DOS

Ich habe ein PowerBasic-Programm geschrieben wait.exe, in dem Sie einen Millisekunden-Parameter in Ihrer Batch-Datei ü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
0
Shawn