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



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



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



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



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


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



проблема в том, что в a нет" сна", который можно использовать .Bat-файл.

803   30  

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

Б. Н. Пожалуйста, обратите внимание, однако (спасибо Дэн!), что 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 сметет эту "ошибку" под ковер

The 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

эта ссылка поможет вам еще.

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

во-вторых, стоит упомянуть, что, хотя он может не делать именно то, что вы хотите, используя встроенный инструмент для обрезки окон, вы можете вызвать надрез на нем без использования мыши. Запустите инструмент для обрезки, выйдите из текущего СНиПа, но оставьте инструмент работает, и нажмите 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 позволяет мне видеть, когда скрипт завершен, и пинг обеспечивает задержку. Дополнительные знаки @ означают, что я вижу текст "готово", и ожидание происходит без меня, отвлекаясь на их команды.

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

еще два способа, которые должны работать на все от 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

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

команда 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, чтобы сделать задержку в пакетном файле:

задержка файла.Летучая мышь

@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 at http://www.sleepcmd.com/.EXE файл должен быть в той же папке, что и программа, которую вы написали!

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

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

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

PING -n 60 127.0.0.1>nul

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

в 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 to c:\windows\system32

использование:

sleep 500

спит в течение 0,5 секунды. Аргументы в МС. После копирования в System32, можно использовать везде.

EDIT: вы также должны быть далеко, что если машина не подключена к сети (скажем, портативный, который вы используете в метро), трюк 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 или сна.летучая мышь и запустить его

пинг ждет о 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

синтаксис команды пауза: пауза d \\где d представляет длительность в секундах

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

Comments

    Ничего не найдено.