Как спать в течение 5 секунд в командном файле /cmd?
Инструмент Windows Snipping может захватывать экран, но иногда я хочу сделать снимок через 5 секунд, например, сделать снимок, отображаемый веб-камерой. (Запустите скрипт и улыбнитесь камере, например).
Мой вопрос: как спать в течение 5 секунд в пакетном файле?
31 ответ
Один из способов - использовать (пропустить) команду ping:
ping 127.0.0.1 -n 6 > nul
Объяснение:
ping
системная утилита, которая отправляет запросы pingping
доступно во всех версиях Windows.127.0.0.1
это IP-адрес localhost. Этот IP-адрес гарантированно всегда разрешается, доступен и немедленно реагирует на пинги.-n 6
указывает, что должно быть 6 пингов. Между каждым пингом задержка составляет 1 с, поэтому для задержки 5 с необходимо отправить 6 пингов.> nul
подавить выводping
, перенаправив его наnul
,
Я очень удивлен, что никто не упомянул:
C:\> timeout 5
NB Пожалуйста, обратите внимание, однако (спасибо Дэн!), Что timeout 5
средства:
Спи где-нибудь между 4 и 5 секундами
Это можно проверить эмпирически, поместив следующее в пакетный файл, запустив его несколько раз и рассчитав разницу во времени между первым и вторым echo
s:
@echo off
echo %time%
timeout 5 > NUL
echo %time%
Следующий хак, давай поспим 5 секунд
ping -n 6 127.0.0.1 > nul
Поскольку пинг ждет секунду между пингами, вам нужно указать еще один, чем вам нужно.
Попробуйте команду выбора. Это было вокруг начиная с 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."
Если у вас есть PowerShell в вашей системе, вы можете просто выполнить эту команду:
powershell -command "Start-Sleep -s 5"
Изменить: люди подняли вопрос, где время, которое 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 мс).
Вы можете сделать это с timeout
:
Это будет видно: timeout 5
Это не будет видно timeout 5 >nul
Мы не можем сделать 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 секунду, вы можете взять побелевшие почти до 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
Есть!
SLEEP <seconds>
Если вы хотите это в миллисекундном режиме:
SLEEP -m <time in milliseconds>
Это более полезно, чем TIMEOUT
так как TIMEOUT
можно прервать нажатием клавиши или CTRL + C
(за TIMEOUT /t <secs> /nobreak
). SLEEP
не может быть прервано ничем (кроме кнопки закрытия:p)
Другой PING
, Но PING
необходимо подключение к Интернету, потому что вы будете записывать подключение сайта.
Два ответа:
Во-первых, чтобы задержать пакетный файл, просто без всех тупых методов, которые люди предлагали:
timeout /t <TimeoutInSeconds> [/nobreak]
http://technet.microsoft.com/en-us/library/cc754891.aspx
Во-вторых, стоит упомянуть, что, хотя он может и не выполнять то, что вам нужно, используя встроенный инструмент Windows Snipping, вы можете запустить его без использования мыши. Запустите инструмент обрезки, выйдите из текущего фрагмента, но оставьте инструмент включенным и нажмите Control + Print Screen, когда вы хотите, чтобы фрагмент выполнялся. Это не должно мешать тому, что вы пытаетесь обрезать.
Я пытался сделать это из задачи msbuild, и выбор и время ожидания не работали из-за перенаправления ввода / вывода.
Я закончил тем, что использовал sleep.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 несколько раз параллельно, и он создает временные файлы / базы данных на основе текущего времени эпохи в секундах - что, конечно, означает, что если вы запускаете несколько экземпляров, каждый из них использует одно и то же временное имя. Первоначально я пытался использовать MSBuild Extension Pack Thread.Sleep
команда, но кажется, что (обычно) она выполняла задание сна нормально, но затем запускала <exec>
задача во всех потоках одновременно, и, конечно, dbghost.exe не будет работать с конфликтами. Пока что использование sleep.exe кажется более надежным.
Еще два способа работы с XP и выше:
с w32tm
w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2 1>nul
с typeperf:
typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul
Это последняя версия того, что я использую на практике для десятисекундной паузы, чтобы увидеть вывод по завершении сценария.
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
Сделанное эхо позволяет мне увидеть, когда сценарий завершен, и пинг обеспечивает задержку. Дополнительные знаки @ означают, что я вижу "готовый" текст, и ожидание происходит без того, чтобы меня отвлекали их команды.
Я испробовал различные решения, приведенные здесь, на машине с 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 не должен появляться в Интернете, поэтому проверка связи с этим адресом предотвращает рассылку спама никому! Я изменил текст выше соответственно!
Я сделал это. Это работает и показывает оставшееся время в секундах. Если вы хотите использовать его, добавьте в командный файл:
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
Усовершенствование кода, предложенного пользователем 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
Вы можете использовать VBScript, например, файл 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
Я использую следующий метод, полностью основанный на возможностях Windows XP, чтобы сделать задержку в командном файле:
Файл 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
Вы также можете вставить день в расчет, чтобы метод также работал, когда интервал задержки превышал полночь.
Это можно сделать с помощью двух простых строк в командном файле: написать временную .vbs
файл в %temp%
папку и назовите это:
echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
cscript "%temp%\sleep.vbs"
Самый простой способ сделать это было так:
Загрузите файл Sleep.exe по адресу http://www.sleepcmd.com/. Файл.exe должен находиться в той же папке, что и программа, которую вы написали!
PING -n 60 127.0.0.1>nul
если ваш сетевой адаптер недоступен.
Если у вас есть подходящая версия Windows и Windows Server 2003 Resource Kit Tools, она включает команду сна для пакетных программ. Больше на: http://malektips.com/xp_dos_0002.html
При использовании "ping" -n будет определять время ожидания только тогда, когда нет ответа на пинг. Посмотрите этот пост о реализации DELAY в виде командного файла.
Команда DELAY реализована в виде командного файла
Я мог бы просто скопировать и вставить важные фрагменты, но весь пост весьма полезен.
Создайте cmd-файл с именем sleep.cmd:
REM Usage: SLEEP Time_in_MiliSECONDS
@ECHO off
ping 1.0.0.0 -n 1 -w %1 > nul
Скопируйте sleep.cmd в c:\windows\system32
Использование:
sleep 500
Спит 0,5 секунды. Аргументы в мс. После копирования в System32 можно использовать везде.
РЕДАКТИРОВАТЬ: Вы также должны быть в стороне, что, если машина не подключена к сети (скажем, портативный, который вы используете в метро), трюк пинг больше не работает.
ping ждет около 5 секунд до истечения времени ожидания, а не 1 секунду, как было указано выше. То есть, если вы не скажете ему подождать только 1 секунду до истечения времени ожидания.
ping 1.0.0.1 -n 1 -w 1000
будет пинговать один раз, ждать ответа только 1 секунду (1000 мс), затем время ожидания.
Таким образом, примерно 20-секундная задержка будет:
ping 1.0.0.1 -n 20 -w 1000
Ну, это работает, если у вас есть выбор или пинг.
@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
просто назовите это sleep.cmd или sleep.bat и запустите
Я написал мощную программу wait.exe, где вы передаете ей параметр миллисекунды в своем пакетном файле.
wait 3000
system('c:/windows/system32/SnippingTool.exe')
код для EXE:
FUNCTION PBMAIN()
c$ = Command$
s! = Val(c$)*1000
Sleep s!
END FUNCTION
Это должно сделать трюк: выбор /T 5 /N /D Y
Замените 5 на время в секундах, которое вы хотите подождать...
В новых версиях ОС Windows вы можете использовать команду
sleep /w2000
в сценарии DOS (.cmd
или же .bat
) ждать 2 с (2000 мс - подставьте нужное вам время в мс). Будьте осторожны, чтобы включить /w
аргумент - без этого весь компьютер усыпляется! Ты можешь использовать -m
вместо /m
если вы хотите и, необязательно, двоеточие (:) между w и числом.