Как спать в течение 5 секунд в командной строке Windows? (или DOS) [дубликат]
этот вопрос уже есть ответ здесь:
- как ждать в пакетный скрипт? [дубликат] 6 ответов
инструмент обрезки Windows может захватывать экран, но иногда я хочу захватить экран через 5 секунд, например, принимая изображение, отображаемое веб-камерой. (запустите сценарий и улыбнитесь в камеру, образец.)
поэтому в Ruby я мог бы сделать что-то вроде
sleep 3
system('c:/windows/system32/SnippingTool.exe')
но не у всех компьютеров есть Ruby, так как я могу это сделать .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
Б. Н. обратите внимание, однако (спасибо Dan!) это timeout 5
означает:
Сон в любом месте между 4 и 5 секунд
Это можно проверить эмпирически, поместив следующее в пакетный файл, запустив его повторно и рассчитав разницу во времени между первым и вторым echo
s:
@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
сметет эту "ошибку" под ковер
на waitfor
команда должна быть там в ОС Windows после Win95
в прошлом я скачал исполняемый файл с именем sleep
это будет работать в командной строке после того, как вы поместите его на свой путь.
например: sleep shutdown -r -f /m \yourmachine
хотя shutdown теперь имеет опцию-t, встроенную в
Timeout /t 1 >nul
похоже на паузу в 1 секунде, вы можете взять limed почти 100.000 (99.999) секунд. Если вы подключены к интернету, лучшим решением будет:
ping 1.1.1.1. -n 1 -w 1000 >nul
при пинге вы считаете в миллисекундах, поэтому одна секунда будет 1000 миллисекунд. Но команда ping немного сомнительна, она не работает одинаково на автономных машинах.
Проблема в том, что машина запутывается, потому что она отключена, и она хотела бы пинг website/server/host/ip
, но он не может.
Поэтому я бы рекомендовал timeout.
Удачи!
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 Pack Thread.Sleep
команда, но кажется ,что (обычно) она выполняла задачу сна нормально, но затем запускала <exec>
задач в все потоки одновременно, и, конечно же, dbghost.exe потерпит неудачу с конфликтами. До сих пор, используя сон.exe кажется более надежным.
два ответа:
во-первых, чтобы задержать пакетный файл, просто без всех тупых методов, которые люди предлагали:
timeout /t <TimeoutInSeconds> [/nobreak]
http://technet.microsoft.com/en-us/library/cc754891.aspx
во-вторых, стоит отметить, что, хотя он может не делать именно то, что вы хотите, используя встроенный инструмент Windows snipping, вы можете вызвать СНиП на нем без использования мыши. Запустите инструмент обрезки, выйдите из текущего СНиПа, но оставьте запуск инструмента и нажмите 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 > nul
echo done позволяет мне видеть, когда скрипт завершен, и ping обеспечивает задержку. Дополнительные знаки @ означают, что я вижу текст "готово", и ожидание происходит без меня, отвлекаясь на их команды.
Я пробовал различные решения, приведенные здесь на машине 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 второй временной задержки между попытками пинга: в конце концов, мало оснований ожидать другого результата, если вы пингуете снова немедленно, и лучше дать сети немного времени, чтобы оправиться от любой проблемы, она имела.
Edit: украдено из следующий пост, .. 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
еще два способа, которые должны работать на всем от ХР и выше:
С команду w32tm
w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2 1>nul
wtih typeperf:
typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul
используя "ping",- n будет определять тайм-аут только тогда, когда нет ответа на ping. Ознакомьтесь с этим сообщением о реализации DELAY в виде пакетного файла.
команда 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, чтобы сделать задержку в пакетном файле:
задержка файла.Летучая мышь!--4-->
@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
@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 в http://www.sleepcmd.com/. То .EXE файл должен быть в той же папке, что и программа, которую вы написали!
Это можно сделать с помощью двух простых строк в пакетном файле: написать временный на %temp%
папка и назовите ее:
echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
cscript "%temp%\sleep.vbs"
Если у вас есть соответствующая версия Windows и Средства Набора Ресурсов Windows Server 2003, Он включает в себя команду 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 в c:\windows\system32
использование:
sleep 500
спит 0,5 секунды. Аргументы в ms. После копирования в System32 можно использовать везде.
EDIT: вы также должны быть далеко, что если машина не подключена к сети (скажем, портативный, который вы используете в метро), трюк ping больше не работает.
Ну это работает, если у вас есть выбор или 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 или сна.летучая мышь и запустить его
ping ждет около 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
синтаксис команды pause: пауза d \\где d представляет продолжительность в секундах
Я использую Windows 7 (32 бит), но я не знаю о других.