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

этот вопрос уже есть ответ здесь:

инструмент обрезки 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 секунд

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

@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

вы можете сделать это с timeout:

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

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


Если у вас 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

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


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

скачать спать.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


PING -n 60 127.0.0.1>nul

в случае, если ваш адаптер LAN недоступен.


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


создайте файл 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 бит), но я не знаю о других.