Как спать в течение 5 секунд в командном файле /cmd?

Инструмент Windows Snipping может захватывать экран, но иногда я хочу сделать снимок через 5 секунд, например, сделать снимок, отображаемый веб-камерой. (Запустите скрипт и улыбнитесь камере, например).

Мой вопрос: как спать в течение 5 секунд в пакетном файле?

31 ответ

Решение

Один из способов - использовать (пропустить) команду ping:

ping 127.0.0.1 -n 6 > nul

Объяснение:

  • ping системная утилита, которая отправляет запросы ping ping доступно во всех версиях 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 секундами

Это можно проверить эмпирически, поместив следующее в пакетный файл, запустив его несколько раз и рассчитав разницу во времени между первым и вторым echos:

@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 можно использовать везде.

РЕДАКТИРОВАТЬ: Вы также должны быть в стороне, что, если машина не подключена к сети (скажем, портативный, который вы используете в метро), трюк пинг больше не работает.

В Windows XP SP3 вы можете использовать команду сна

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 и числом.

Другие вопросы по тегам