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

592 太極者無極而生 [2009-11-04 11:13:00]

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

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

command-line windows sleep timeout batch-file


32 ответа


744 Решение Martin [2009-11-04 11:20:00]

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

ping 127.0.0.1 -n 6 > nul

Объяснение:

  • ping - системная утилита, которая отправляет запросы ping. ping доступен во всех версиях Windows.
  • 127.0.0.1 - это IP-адрес локального хоста. Этот IP-адрес гарантированно всегда разрешается, доступен и немедленно реагирует на пинги.
  • -n 6 указывает, что должно быть 6 пингов. Между каждым пингом задержка составляет 1 с, поэтому для задержки 5 с необходимо отправить 6 пингов.
  • > nul подавить вывод ping, перенаправив его на nul.

1283 asveikau [2009-11-04 11:29:00]

Я очень удивлен, что никто не упомянул:

C:\> timeout 5

N.B. Обратите внимание, однако (спасибо Dan!), что timeout 5 означает:

Спящий режим между 4 и 5 секундами

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

@echo off
echo %time%
timeout 5 > NUL
echo %time%

64 Adam Porad [2010-05-05 21:48:00]

Попробуйте выполнить команду Choice. Это было с MSDOS 6.0 и должно было сделать трюк.

Используйте параметр /T, чтобы указать время ожидания в секундах и параметр /D, чтобы указать выбор по умолчанию и игнорировать выбранный выбор.

Единственное, что может быть проблемой, заключается в том, что пользователь вводит один из символов выбора до истечения периода ожидания. Частичная обработка - это обфускация ситуации - используйте аргумент /N, чтобы скрыть список допустимых вариантов и только один символ в наборе вариантов, поэтому будет менее вероятно, что пользователь будет вводить правильный выбор до истекает время ожидания.

Ниже приведен текст справки в 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."

49 noctonura [2009-11-04 11:20:00]

Следующий хак позволит вам поспать 5 секунд

ping -n 6 127.0.0.1 > nul

Поскольку пинг ждет секунду между пингами, вам нужно указать еще один, чем вам нужно.


33 Alex [2014-03-03 19:59:00]

Вы можете сделать это с помощью timeout:

Это будет видно: timeout 5

Это не будет видно timeout 5 >nul


33 Niall Connaughton [2013-05-29 03:00:00]

Если у вас есть PowerShell в вашей системе, вы можете просто выполнить эту команду:

powershell -command "Start-Sleep -s 5"

Изменить: люди подняли проблему, когда количество времени, которое требуется для запуска, будет значительным по сравнению с тем, как долго вы пытаетесь дождаться. Если важна точность времени ожидания (т.е. Вторая или две дополнительные задержки неприемлемы), вы можете использовать этот подход:

powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

Это занимает время, когда была выписана команда Windows, а powershell script спящий до 5 секунд после этого времени. Таким образом, пока PowerShell занимает меньше времени, чем ваша продолжительность сна, этот подход будет работать (он составляет около 600 мс на моей машине).


28 joe li [2012-10-31 21:14:00]

Не можем ли мы сделать waitfor /T 180?

waitfor /T 180 pause приведет к ошибке "ОШИБКА: время ожидания ожидания" пауза "".

waitfor /T 180 pause >nul развернет эту "ошибку" под ковриком

Команда waitfor должна присутствовать в ОС Windows после Win95

В прошлом я загрузил исполняемый файл с именем sleep, который будет работать в командной строке после того, как вы поместите его в свой путь.

Например: sleep shutdown -r -f /m \\yourmachine хотя shutdown теперь имеет опцию -t, встроенную в


22 Jonathan [2013-07-28 16:26:00]

Timeout /t 1 >nul

Как пауза в 1 секунде, вы можете взять известкование до почти 100 000 (99,999). Если вы подключены к Интернету, лучшим решением будет:

ping 1.1.1.1. -n 1 -w 1000 >nul

Когда вы выполняете ping, вы рассчитываете в миллисекундах, поэтому одна секунда будет 1000 миллисекунд. Но команда ping немного, но она не работает на автономных машинах. Проблема в том, что машина запуталась, потому что она отключена, и она хотела бы пинговать website/server/host/ip, но это невозможно. Поэтому я бы порекомендовал тайм-аут. Удачи!


17 Amir [2016-02-19 23:45:00]

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

эта ссылка поможет вам больше.


10 Ned Martin [2014-07-12 05:03:00]

Два ответа:

Во-первых, чтобы задержать командный файл, просто без всех тупых методов, которые люди предлагали:

timeout /t <TimeoutInSeconds> [/nobreak] 

http://technet.microsoft.com/en-us/library/cc754891.aspx

Во-вторых, стоит упомянуть, что, хотя он может не делать именно то, что вы хотите, используя встроенный инструмент обрезки Windows, вы можете запускать его без использования мыши. Запустите инструмент для отрезки, выйдите из текущего среза, но оставьте инструмент включенным и нажмите "Control + Print Screen", когда вы хотите, чтобы snip произошел. Это не должно мешать тому, что вы пытаетесь отрезать.


10 gregmac [2012-11-06 00:01:00]

Я пытался сделать это из задачи 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 несколько раз параллельно и создает временные файлы/базы данных на основе текущей эпохи в секундах, что, конечно же, означает, что вы запускаете несколько экземпляров, каждый из них использует то же имя temp. Первоначально я пытался использовать команду MSBuild Extension Pack Thread.Sleep, но кажется, что (как правило) она выполняла задачу сна, но затем запускала задачу <exec> во всех потоках одновременно и, конечно, dbghost. exe потерпит неудачу с конфликтами. До сих пор использование sleep.exe кажется более надежным.


5 user1884308 [2012-12-07 06:31:00]

Я сделал это. Он работает и показывает время в секундах. Если вы хотите использовать его, добавьте в пакетный файл:

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

5 user3070485 [2014-09-18 12:07:00]

Это последняя версия того, что я использую на практике в течение десяти секундной паузы, чтобы увидеть результат, когда заканчивается script.

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

Выполненное эхо позволяет увидеть, когда закончится script, а ping обеспечивает задержку. Дополнительные знаки @означают, что я вижу "сделанный" текст, и ожидание происходит без меня, отвлекаясь на их команды.

Я пробовал различные решения, приведенные здесь на машине XP, поскольку идея заключалась в том, чтобы иметь командный файл, который запускался на разных машинах, и поэтому я выбрал машину XP, поскольку среда, которая может быть наименее способной.

GOOD> ping 192.0.2.0 -n 1 -w 3000 > nul

Это, казалось, дало трехмесячную задержку, как ожидалось. Одна попытка ping длится 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 на практике, я побежал

ping 192.0.2.0 -n 5 -w 5000

Это заняло около 30 секунд, хотя 5 * 5 = 25. Мое объяснение состоит в том, что в течение 5 секунд есть 5 попыток пинга, но между попытками пинга есть 1 секунда задержки: по крайней мере, есть небольшая причина ожидать другого результата, если вы снова будете пингом, и лучше дать сети немного времени, чтобы оправиться от любой проблемы, с которой она столкнулась.

Изменить: украдено из другое сообщение,.. RFC 3330 говорит, что IP-адрес 192.0.2.0 не должен появляться в Интернете, поэтому проверка этого адреса не позволяет этим тестам спамить кого-либо! Я изменил текст выше, соответственно!


4 npocmaka [2015-10-22 19:36:00]

еще два способа работы с XP и выше:

с w32tm

w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2  1>nul 

wtih typeperf:

typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul

4 Dani [2009-11-04 11:19:00]

Вы можете использовать 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

3 Rober [2012-11-04 22:14:00]

Улучшение кода, предложенного пользователем 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

3 Xavi [2012-12-11 10:02:00]

Самый простой способ я сделал это:

Скачайте Sleep.exe на http://www.sleepcmd.com/. Файл .exe должен находиться в той же папке, что и программа, которую вы написали!


3 Nikos Steiakakis [2009-11-04 11:27:00]

Используя "ping", -n определит тайм-аут только тогда, когда нет ответа на пинг. Проверьте это сообщение о внедрении DELAY в виде пакетного файла.

Команда DELAY реализована как пакетный файл

Я мог бы просто скопировать-вставить важные биты, но весь пост весьма полезен.


3 AjV Jsy [2013-06-17 21:53:00]

Это можно сделать с помощью двух простых строк в пакетном файле: записать временный файл .vbs в папку %temp% и вызвать его:

echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
cscript "%temp%\sleep.vbs"

3 Aacini [2011-07-24 13:19:00]

Я использую следующий метод, полностью основанный на возможностях 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

Вы также можете вставить день в вычисление, чтобы этот метод также работал, когда интервал задержки прошел за полночь.


2 user3584216 [2014-04-29 10:13:00]

PING -n 60 127.0.0.1>nul

если ваш сетевой адаптер недоступен.


2 GreenMatt [2010-05-05 22:06:00]

Если у вас есть соответствующая версия Windows и Windows Resource Kit Resource Kit Tools, она включает в себя команду сна для пакетных программ. Подробнее: http://malektips.com/xp_dos_0002.html


1 thebunnyrules [2016-03-25 04:57:00]

Создайте 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 секунды. Аргументы в ms. После копирования в System32 можно использовать всюду.

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


1 Andres [2014-06-27 21:16:00]

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


0 Doctor DOS [2012-04-20 00:10:00]

Хорошо, это работает, если у вас есть выбор или пинг.

@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 и запустите его


0 LionelGoulet [2016-01-27 02:45:00]

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


0 Shawn [2017-06-06 18:35:00]

Я написал мощную программу wait.exe, где вы передаете ей миллисекундный параметр в пакетном файле

wait 3000
system('c:/windows/system32/SnippingTool.exe')

код для EXE:

FUNCTION PBMAIN()
  c$ = Command$
  s! = Val(c$)*1000
  Sleep s!         
END FUNCTION

-1 Smits [2013-12-09 14:34:00]

Это должно сделать трюк: выбор /T 5/N/D Y

Замените 5 временем в секундах, которое вы хотите подождать...


-1 jon [2013-05-15 12:42:00]

В новых версиях ОС Windows вы можете использовать команду

sleep /w2000

в DOS script (.cmd или .bat), чтобы подождать 2 секунды (2000 мс - замените время в миллисекундах, которое вам нужно). Будьте осторожны, чтобы включить аргумент /w - без него весь компьютер засыпает! Вы можете использовать -m вместо /m, если хотите, и необязательно двоеточие (:) между w и числом.


-3 Srijan Acharya [2013-03-17 20:43:00]

Я думаю, что следующая команда может помочь:

pause 5

Синтаксис команды pause: пауза d \\, где d - продолжительность в секундах

Я использую Windows 7 (32 бит), но я не знаю других.


-3 scriptmastere02 [2017-12-28 05:10:00]

Есть!

SLEEP <seconds>

Если вы хотите его в миллисекундах:

SLEEP -m <time in milliseconds>

Это более полезно, чем TIMEOUT, потому что TIMEOUT может быть прервано нажатием клавиши или CTRL + C (для TIMEOUT /t <secs> /nobreak). SLEEP не может быть отменено ничем (кроме кнопки закрытия: p)

Другой - PING. Но PING требуется подключение к Интернету, потому что вы будете записывать соединение с сайтом.


-9 Amir Saniyan [2014-07-09 13:26:00]

Сон - не очень хорошая идея. Позвольте пользователю выбрать, когда он или она будет готов:

pause
Press any key to continue . . .