Как спать в течение 5 секунд в командной строке Windows? (или DOS)

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

Итак, в Ruby я мог бы сделать что-то вроде

 sleep 3
system('c:/windows/system32/SnippingTool.exe')
 

но не у всех компьютеров есть Ruby, так как я могу это сделать в .bat-файле? (что-то, что запускается на большинстве ПК с помощью инструмента Snipping).

Проблема в том, что в файле .bat нет «сна».

вопрос задан 4.11.2009
太極者無極而生
68259 репутация

32 ответов


  • 1226 рейтинг

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

     C:\> timeout 5
     

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

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

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

     @echo off
    echo %time%
    timeout 5 > NUL
    echo %time%
     
    ответ дан asveikau, с репутацией 29615, 4.11.2009
  • 716 рейтинг

    Один хак, который я видел, - это (неверно) использовать команду ping:

     ping 127.0.0.1 -n 6 > nul
     

    127.0.0.1 - это IP-адрес локального хоста.
    -n 6 - между каждым пингом существует 1 с задержка, поэтому для задержки 5 с вам нужно сделать 6 пинов.
    > nul - подавление выхода.

    ответ дан Martin, с репутацией 26832, 4.11.2009
  • 62 рейтинг

    Попробуйте команду « Выбор» . Это было с 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."
     
    ответ дан Adam Porad, с репутацией 10652, 5.05.2010
  • 48 рейтинг
     rem *** HACK ALERT: Sleep for 5 seconds ***
    ping -n 6 127.0.0.1 > nul
    rem ***************************************
     
    • Исправлено, как пояснил @Joey
    ответ дан noctonura, с репутацией 5636, 4.11.2009
  • 31 рейтинг

    Если у вас есть 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 спящий до 5 секунд после этого времени. Таким образом, пока PowerShell занимает меньше времени, чем ваша продолжительность сна, этот подход будет работать (он составляет около 600 мс на моей машине).

    ответ дан Niall Connaughton, с репутацией 9513, 29.05.2013
  • 31 рейтинг

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

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

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

    ответ дан Alex, с репутацией 339, 3.03.2014
  • 26 рейтинг

    Разве мы не можем сделать waitfor /T 180 ?

    waitfor /T 180 pause приведет к «ОШИБКЕ: время ожидания ожидания паузы».

    waitfor /T 180 pause >nul будет подметать эту «ошибку» под ковриком

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

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

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

    ответ дан joe li, с репутацией 261, 31.10.2012
  • 21 рейтинг

    Timeout /t 1 >nul

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

    ping 1.1.1.1. -n 1 -w 1000 >nul

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

    ответ дан Jonathan, с репутацией 331, 28.07.2013
  • 15 рейтинг

    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

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

    ответ дан Amir, с репутацией 787, 19.02.2016
  • 10 рейтинг

    Я пытался сделать это из задачи 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 кажется более надежным.

    ответ дан gregmac, с репутацией 18007, 5.11.2012
  • 9 рейтинг

    Два ответа:

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

     timeout /t <TimeoutInSeconds> [/nobreak] 
     

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

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

    ответ дан Ned Martin, с репутацией 288, 12.07.2014
  • 5 рейтинг

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

     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 на практике, я побежал

     ping 192.0.2.0 -n 5 -w 5000
     

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

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

    ответ дан user3070485, с репутацией 1144, 18.09.2014
  • 4 рейтинг

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

     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
     
    ответ дан user1884308, с репутацией 41, 7.12.2012
  • 4 рейтинг

    Вы можете использовать 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
     
    ответ дан Dani, с репутацией 10115, 4.11.2009
  • 4 рейтинг

    еще два пути, которые должны работать на все: от XP и выше:

    с w32tm

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

    с typeperf:

     typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul
     
    ответ дан npocmaka, с репутацией 40468, 22.10.2015
  • 3 рейтинг

    Улучшение кода, предложенного пользователем 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
     
    ответ дан Rober, с репутацией 31, 4.11.2012
  • 3 рейтинг

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

     echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
    cscript "%temp%\sleep.vbs"
     
    ответ дан AjV Jsy, с репутацией 3587, 17.06.2013
  • 3 рейтинг

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

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

    ответ дан Xavi, с репутацией 72, 11.12.2012
  • 3 рейтинг

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

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

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

    ответ дан Nikos Steiakakis, с репутацией 4237, 4.11.2009
  • 3 рейтинг

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

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

    ответ дан Aacini, с репутацией 49420, 24.07.2011
  • 2 рейтинг
     PING -n 60 127.0.0.1>nul
     

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

    ответ дан user3584216, с репутацией 21, 29.04.2014
  • 2 рейтинг

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

    ответ дан GreenMatt, с репутацией 12862, 5.05.2010
  • 1 рейтинг

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

    EDIT: вам также следует избегать того, что если устройство не подключено к сети (скажем, портативному, что вы используете в метро), трюк ping больше не работает.

    ответ дан thebunnyrules, с репутацией 512, 25.03.2016
  • 1 рейтинг

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

    ответ дан Andres, с репутацией 103, 27.06.2014
  • 0 рейтинг

    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

    ответ дан LionelGoulet, с репутацией 234, 26.01.2016
  • 0 рейтинг

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

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

    ответ дан Doctor DOS, с репутацией 198, 19.04.2012
  • 0 рейтинг

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

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

    код для EXE:

     FUNCTION PBMAIN()
      c$ = Command$
      s! = Val(c$)*1000
      Sleep s!         
    END FUNCTION
     
    ответ дан Shawn, с репутацией 1680, 6.06.2017
  • -1 рейтинг

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

     sleep /w2000
     

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

    ответ дан jon, с репутацией 15, 15.05.2013
  • -2 рейтинг

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

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

    ответ дан Smits, с репутацией 27, 9.12.2013
  • -3 рейтинг

    Есть!

     SLEEP <seconds>
     

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

     SLEEP -m <time in milliseconds>
     

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

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

    ответ дан scriptmastere02, с репутацией 28, 28.12.2017
  • -3 рейтинг

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

     pause 5
     

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

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

    ответ дан Srijan Acharya, с репутацией 11, 17.03.2013
  • -9 рейтинг

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

     pause
    Press any key to continue . . .
     
    ответ дан Amir Saniyan, с репутацией 4904, 9.07.2014