Как спать в течение 5 секунд в командной строке Windows? (или DOS) [дубликат]
этот вопрос уже есть ответ здесь:
как ждать в пакетный скрипт? [дубликат]
6 ответов
инструмент обрезки Windows может захватывать экран, но иногда я хочу захватить экран через 5 секунд, например, принимая изображение, отображаемое веб-камерой. (запустите сценарий и улыбнитесь в камеру, ибо образец.)
Так что в Ruby, я мог бы сделать что-то вроде
sleep 3
system('c:/windows/system32/SnippingTool.exe')
но не все компьютеры имеют Ruby, так как я могу сделать это в a .bat файл? (что-то, что можно запустить на большинстве ПК с помощью инструмента для обрезки).
проблема в том, что в a нет" сна", который можно использовать .Bat-файл.
30 ответов:
один хак я видел, чтобы (mis) использовать команду ping:
ping 127.0.0.1 -n 6 > nul
127.0.0.1- это IP-адрес localhost.-n 6- существует задержка 1s между каждым пингом, поэтому для задержки 5s вам нужно сделать 6 пингов.> nul- подавить вывод.
Я очень удивлен что никто не упомянул:
C:\> timeout 5
Б. Н. Пожалуйста, обратите внимание, однако (спасибо Дэн!), что
timeout 5означает:спать в любом месте между 4 и 5 секунд
Это можно проверить эмпирически, поместив следующее в пакетный файл, запустив его повторно и рассчитав разницу во времени между первым и вторым
echos:@echo off echo %time% timeout 5 > NUL echo %time%
попробовать выбор. Это было вокруг с MSDOS 6.0, и должно сделать трюк.
используйте параметр /T для указания времени ожидания в секундах, а параметр /D для указания выбора по умолчанию и игнорирования затем выбранного выбора.
одна вещь, которая может быть проблемой, если пользователь вводит один из символов выбора до истечения периода ожидания. Частичная обходная работа заключается в том, чтобы запутать ситуацию-используйте аргумент /N, чтобы скрыть список допустимых вариантов и только 1 символ в наборе вариантов, поэтому будет менее вероятно, что пользователь введет допустимый выбор до истечения таймаута.
Ниже приведен текст справки В Windows Vista. Я думаю, что это то же самое на XP, Но посмотрите на текст справки на компьютере XP, чтобы проверить.
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."
rem *** HACK ALERT: Sleep for 5 seconds *** ping -n 6 127.0.0.1 > nul rem ***************************************
- исправлено, как объяснил @Joey
Если у вас PowerShell на вашей системе, вы можете просто выполнить следующую команду:
powershell -command "Start-Sleep -s 5"
Edit: люди подняли проблему, когда количество времени, которое требуется powershell для запуска, значительно по сравнению с тем, как долго вы пытаетесь ждать. Если точность времени ожидания важна (т. е. вторая или две дополнительные задержки не приемлемы), вы можете использовать этот подход:
powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"это занимает время, когда была выпущена команда windows, и сценарий powershell спит до 5 секунд после этого времени. Так что пока powershell занимает меньше времени для запуска, чем продолжительность сна, этот подход будет работать (это около 600 мс на моей машине).
мы не можем сделать
waitfor /T 180?
waitfor /T 180 pauseприведет к "ошибка: тайм-аут ожидания 'пауза'."
waitfor /T 180 pause >nulсметет эту "ошибку" под коверThe
waitforкоманда должна быть там в ОС Windows после Win95в прошлом я скачал исполняемый файл с именем
sleepэто будет работать в командной строке после того, как вы поместите его в свой путь.например:
sleep shutdown -r -f /m \yourmachineхотя shutdown теперь имеет встроенную опцию-t
Timeout /t 1 >nulэто как пауза в 1 секунда, вы можете взять известь почти до 100.000 (99.999) секунд. Если вы подключены к интернету лучшим решением будет:
ping 1.1.1.1. -n 1 -w 1000 >nulпри пинге вы считаете в миллисекундах, так что одна секунда будет 1000 миллисекунд. Но команда ping немного сомнительна, она не работает одинаково на автономных машинах. Проблема в том, что машина запутывается, потому что она находится в автономном режиме, и она хотела бы пинг а
website/server/host/ip, но он не может. Поэтому я бы рекомендовал тайм-аут. Удачи вам!
SLEEP 5был включен в некоторые наборы ресурсов Windows.
TIMEOUT 5был включен в некоторые наборы ресурсов Windows, но теперь является стандартной командой в Windows 7 и 8 (не уверен в Vista).
PING 1.1.1.1 -n 1 -w 5000 >NULдля любой версии MS-DOS или Windows с клиентом TCP/IP PING может использоваться для задержки выполнения на несколько секунд.
NETSH badcommand(только для Windows XP/Server 2003) илиCHOICE
Я пытался сделать это из задачи msbuild, и выбор и тайм-аут оба не работали из-за перенаправления ввода-вывода.
Я в конечном итоге с помощью сна.exe от http://sourceforge.net/projects/unxutils, Что приятно, потому что он не требует установки и он крошечный.
изо
choice:<Target Name="TestCmd"> <Exec Command="choice /C YN /D Y /t 5 " /> </Target>результаты:
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.
изо
timeout:<Target Name="TestCmd"> <Exec Command="timeout /t 5 " /> </Target>результаты в:
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.
в сторону:
Я на самом деле с помощью
<Exec Command="sleep 2 & dbghost.exe" />потому что я выполняю dbghost.exe несколько раз параллельно, и он создает временные файлы / базы данных на основе текущего времени эпохи в секундах - что, конечно, означает, что если вы запускаете несколько экземпляров, каждый использует одно и то же имя temp. Я изначально пытался использовать MSBuild Extension PackThread.Sleepкоманда, но кажется, что (обычно) она отлично выполняла задачу сна, но затем запускала<exec>задач в все потоки одновременно, и конечно dbghost.exe потерпит неудачу с конфликтами. До сих пор, используя сон.exe кажется более надежным.
два ответа:
во-первых, чтобы задержать пакетный файл, просто без всех тупых методов, которые люди предлагали:
timeout /t <TimeoutInSeconds> [/nobreak]http://technet.microsoft.com/en-us/library/cc754891.aspx
во-вторых, стоит упомянуть, что, хотя он может не делать именно то, что вы хотите, используя встроенный инструмент для обрезки окон, вы можете вызвать надрез на нем без использования мыши. Запустите инструмент для обрезки, выйдите из текущего СНиПа, но оставьте инструмент работает, и нажмите Control + Print Screen, когда вы хотите, чтобы СНиП произошел. Это не должно мешать тому, что вы пытаетесь отрезать.
это последняя версия того, что я использую на практике для десятисекундной паузы, чтобы увидеть вывод, когда скрипт заканчивается.
BEST>@echo done BEST>@set DelayInSeconds=10 BEST>@rem Use ping to wait BEST>@ping 192.0.2.0 -n 1 -w %DelayInSeconds%000 > nulecho done позволяет мне видеть, когда скрипт завершен, и пинг обеспечивает задержку. Дополнительные знаки @ означают, что я вижу текст "готово", и ожидание происходит без меня, отвлекаясь на их команды.
Я пробовал различные решения, приведенные здесь на машине XP, так как идея заключалась в том, чтобы иметь пакетный файл, который будет работать на различных машинах, и поэтому я выбрал машину XP в качестве среды, которая, вероятно, будет наименее способной.
GOOD> ping 192.0.2.0 -n 1 -w 3000 > nulэто, казалось, дало трехсекундную задержку, как и ожидалось. Одна попытка пинга длится указанные 3 секунды.
BAD> ping -n 5 192.0.2.0 > nulэто заняло около 10 секунд (не 5). Мое объяснение заключается в том, что есть 5 попыток пинга, каждая примерно через секунду, делая 4 секунды. И каждая попытка пинга, вероятно, длилась около секунды, что составляет примерно 9 секунд всего.
BAD> timeout 5 BAD> sleep /w2000 BAD> waitfor /T 180 BAD> choiceкоманды недоступны.
BAD> ping 192.0.2.0 -n 1 -w 10000 > nul :: wait 10000 milliseconds, ie 10 secsЯ тоже попробовал выше, прочитав, что комментарии могут быть добавлены в файлы BAT с помощью двух последовательных двоеточий. Однако программное обеспечение вернулось почти мгновенно. Помещая комментарий на свою собственную строку, прежде чем пинг работал нормально.
GOOD> :: wait 10000 milliseconds, ie 10 secs GOOD> ping 192.0.2.0 -n 1 -w 10000 > nulчтобы лучше понять, что пинг делает на практике, я побежала
ping 192.0.2.0 -n 5 -w 5000это заняло около 30 секунд, хотя 5*5=25. Мое объяснение заключается в том, что есть есть 5 попыток пинга каждый продолжительностью 5 секунд, но есть около 1 второй временной задержки между попытками пинга: в конце концов, мало оснований ожидать другого результата, если вы пингуете снова немедленно, и лучше дать сети немного времени, чтобы оправиться от любой проблемы, которая у него была.
изменить: украли из следующий пост, .. RFC 3330 говорит, что IP-адрес 192.0.2.0 не должен появляться в интернете, поэтому pinging этот адрес предотвращает их тесты спама кто-нибудь! Я изменил текст выше соответственно!
можно использовать VBScript, например, file
myscript.vbs:set wsobject = wscript.createobject("wscript.shell") do while 1=1 wsobject.run "SnippingTool.exe",0,TRUE wscript.sleep 3000 loopпакетный файл:
cscript myscript.vbs %1
Я сделал это. Он работает и показывает время, оставшееся в секундах. Если вы хотите использовать его, добавьте в пакетный файл:
call wait 10Он работал, когда я тестировал его.
список
wait.bat(он должен быть в рабочем каталоге или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
еще два способа, которые должны работать на все от XP и выше:
С w32tm
w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2 1>nulwtih typeperf:
typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul
с помощью "ping" - n будет определять тайм-аут только тогда, когда нет ответа на пинг. Проверьте это сообщение о реализации задержки в виде пакетного файла.
команда DELAY реализована в виде пакетного файла
Я мог бы просто скопировать-вставить важные биты, но весь пост довольно полезен.
усовершенствование кода предложенное пользователем Aacini, оно имеет разрешение сотых долей секунды и не дает сбоя при достижении времени 23: 59: 59,99:
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
Я использую следующий метод, полностью основанный на возможностях Windows XP, чтобы сделать задержку в пакетном файле:
задержка файла.Летучая мышь
@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вы также можете вставить день в расчет, поэтому метод также работает, когда интервал задержки проходит через полночь.
самый простой способ, который я сделал это было так:
скачать спать.exe at http://www.sleepcmd.com/.EXE файл должен быть в той же папке, что и программа, которую вы написали!
Это можно сделать с помощью двух простых строк в пакетном файле: написать временный на
%temp%папка и назовите ее:echo WScript.Sleep(5000) >"%temp%\sleep.vbs" cscript "%temp%\sleep.vbs"
Если у вас есть соответствующая версия Windows и Windows Server 2003 Resource Kit Tools, Он включает в себя команду Sleep для пакетных программ. Подробнее по адресу:http://malektips.com/xp_dos_0002.html
создайте файл cmd под названием sleep.cmd:
REM Usage: SLEEP Time_in_MiliSECONDS @ECHO off ping 1.0.0.0 -n 1 -w %1 > nulкопировать сна.cmd to c:\windows\system32
использование:
sleep 500спит в течение 0,5 секунды. Аргументы в МС. После копирования в System32, можно использовать везде.
EDIT: вы также должны быть далеко, что если машина не подключена к сети (скажем, портативный, который вы используете в метро), трюк 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просто назовите его сон.cmd или сна.летучая мышь и запустить его
пинг ждет о 5 секунд тайм-ауту, а не 1 секунду как было указано выше. То есть, если вы рассказать это только ждать в течение 1 секунды, прежде чем тайм-аут.
пинг 1.0.0.1-n 1-w 1000
будет пинг один раз, подождите только 1 секунду (1000 мс) для ответа, а затем тайм-аут.
Так примерно 20-секундная задержка будет:
пинг 1.0.0.1-n 20-w 1000
Я написал программу powerbasic подождать.exe, где вы передаете ему параметр миллисекунды в своем пакетном файле
wait 3000 system('c:/windows/system32/SnippingTool.exe')код для EXE:
FUNCTION PBMAIN() c$ = Command$ s! = Val(c$)*1000 Sleep s! END FUNCTION
в новых версиях ОС Windows вы можете использовать команду
sleep /w2000в скрипте DOS (
.cmdили.bat) ждать 2s (2000 МС - замените время в МС, которое вам нужно). Будьте осторожны, чтобы включить/wаргумент-без него весь компьютер усыпляется! Вы можете использовать-mвместо/mесли вы хотите и необязательно двоеточие (:) между w и числом.
Это должно сделать трюк: choice /T 5 /N / D Y
замените 5 на время в секундах, которое вы хотите подождать...
Я думаю, что следующая команда может помочь:
pause 5синтаксис команды пауза: пауза d \\где d представляет длительность в секундах
Я использую Windows 7 (32 бит), но я не знаю о других.
Comments