command-line länge - Wie in der Windows-Eingabeaufforderung für 5 Sekunden schlafen?(oder DOS)




meta title (25)

Ich verwende die folgende Methode, die vollständig auf Windows XP-Funktionen basiert, um eine Verzögerung in einer Batchdatei 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 den Tag auch in die Berechnung einfügen, so dass die Methode auch funktioniert, wenn das Verzögerungsintervall über Mitternacht verstreicht.

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.


Versuchen Sie den Choice . Es gibt es seit MSDOS 6.0, und sollte es tun.

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

Die einzige Sache, die ein Problem sein könnte, ist, wenn der Benutzer eines der Auswahlzeichen vor Ablauf des Zeitlimits eingibt. Ein partieller Workaround soll die Situation verschleiern - benutze das Argument / N, um die Liste der gültigen Auswahlmöglichkeiten zu verbergen, und habe nur 1 Zeichen in der Auswahlmenge, so dass es weniger wahrscheinlich ist, dass der Benutzer eine gültige Auswahl vorgibt Timeout läuft ab.

Unten ist der Hilfetext zu Windows Vista. Ich denke es ist das selbe unter XP, aber schau dir den Hilfetext auf einem XP Computer an.

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

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"

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!


Sie können es mit timeout :

Dies wird sichtbar sein: timeout 5

Dies wird nicht sichtbar timeout 5 >nul


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

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

Bei Verwendung von "ping" wird -n das Zeitlimit nur dann bestimmen, wenn keine Antwort auf den Ping vorliegt. In diesem Beitrag erfahren Sie, wie Sie DELAY als Batch-Datei implementieren.

DELAY-Befehl als Batch-Datei implementiert

Ich könnte nur die wichtigen Bits kopieren, aber der ganze Beitrag ist sehr nützlich.


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, erwähnenswert, dass es zwar nicht genau das ist, was Sie wollen, indem Sie das eingebaute Windows-Schnipsel-Tool verwenden, können Sie jedoch einen Snip auslösen, ohne die Maus zu benutzen. Führen Sie das Schnipetool aus, verlassen Sie den aktuellen Ausschnitt, lassen Sie das Werkzeug jedoch weiterhin aktiv und drücken Sie Strg + Druck, wenn der Schnitt ausgeführt werden soll. Dies sollte sich nicht störend auf das auswirken, was Sie versuchen zu schnippen.


In Windows XP sp3 können Sie den Befehl "Ruhezustand" verwenden


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

@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

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


zwei weitere Möglichkeiten, die von XP und höher an alles 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

Es gibt!

SLEEP <seconds>

Wenn Sie es im Millisekunden-Modus wollen:

SLEEP -m <time in milliseconds>

Dies ist hilfreicher als TIMEOUT da TIMEOUT mit einem Klick auf eine Taste oder CTRL + C (für TIMEOUT /t <secs> /nobreak ) TIMEOUT /t <secs> /nobreak . SLEEP kann nicht durch irgendetwas abgebrochen werden (außer beim Schließen-Button: p)

Andere sind PING . PING benötigt jedoch eine Internetverbindung, da Sie die Verbindung einer Site aufzeichnen.


Bei neueren Windows-Betriebssystemversionen können Sie den Befehl verwenden

sleep /w2000

In einem DOS-Skript ( .cmd oder .bat ) warten Sie 2s (2000 ms - ersetzen Sie die Zeit in ms, die Sie benötigen). Achten Sie darauf, das Argument /w einzuschließen - ohne es wird der ganze Computer eingeschlafen! Sie können -m anstelle von /m wenn Sie möchten, und optional einen Doppelpunkt (:) zwischen dem w und der Zahl.


Ein Hack, den ich gesehen habe, ist, den Ping-Befehl zu missbrauchen:

ping 127.0.0.1 -n 6 > nul

127.0.0.1 ist die IP-Adresse des lokalen Hosts.
-n 6 - es gibt eine 1s Verzögerung zwischen jedem Ping, also für eine 5s Verzögerung müssen Sie 6 Pings tun.
> nul - unterdrückt die Ausgabe.


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.


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%

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

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.


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


PING -n 60 127.0.0.1>nul

falls Ihr LAN-Adapter nicht verfügbar ist.


Sie können VBScript , 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

Mit call können Sie das Problem der zu früh evaluierten Umgebungsvariablen - z

set A=Hello & call echo %A%




windows command-line batch-file sleep