Как приостановить выполнение на некоторое время в командном файле Windows между командой и следующей?
Как приостановить выполнение на некоторое время в командном файле Windows между командой и следующей?
Ответы:
Правильный способ спать в командном файле - использовать timeout
команду, представленную в Windows 2000.
Чтобы подождать где-то между 29 и 30 секундами :
timeout /t 30
Тайм-аут будет прерван, если пользователь нажмет любую клавишу; однако команда также принимает необязательный параметр /nobreak
, который фактически игнорирует все, что пользователь может нажать, кроме явного CTRL-C
:
timeout /t 30 /nobreak
Кроме того, если вы не хотите, чтобы команда выводила на экран свой обратный отсчет, вы можете перенаправить вывод NUL
:
timeout /t 30 /nobreak > NUL
Так как это применимо и здесь, я скопирую свой ответ с другого сайта .
Если вы хотите использовать пинг, есть лучший способ. Вы захотите пропинговать адрес, который не существует, поэтому вы можете указать время ожидания с точностью до миллисекунды. К счастью, такой адрес определен в стандарте (RFC 3330), и это так 192.0.2.x
. Это не выдумка, это действительно адрес с единственной целью несуществования (это может быть непонятно, но это применимо даже в локальных сетях):
192.0.2.0/24 - Этот блок назначен как «TEST-NET» для использования в документации и примере кода. Он часто используется вместе с именами доменов example.com или example.net в документации поставщика и протокола. Адреса в этом блоке не должны появляться в общедоступном Интернете.
Чтобы спать в течение 123 миллисекунд, используйте ping 192.0.2.1 -n 1 -w 123 >nul
Ping
это просто неправильный инструмент для работы.
Вы также можете вставить пинг в localhost. Это займет 4 секунды для завершения (по умолчанию). Некоторые считают это клуджем, но все равно работает довольно хорошо.
Команда:
ping 127.0.0.1
ping
идет ли ваша ОС или нет . Если вы достаточно волнуетесь о '95 '98 или обо мне, то вы должны быть в равной степени обеспокоены и 6.22, который не имеет ping
ни одного
Отказ от ответственности : это не «идеальное» решение, так что не пытайтесь меня бить по голове тем же, что и тем, кто рекомендует ping
…
По возможности используйте timeout
точно. Но, как отмечено в комментариях, это не всегда вариант (например, в неинтерактивном режиме). После этого я согласен, что ping
«kludge», возможно, является следующим лучшим вариантом, поскольку он очень прост. Тем не менее, я предлагаю другой вариант ... вставлять некоторые VB Script .
Основа этого решения имеет все виды применения помимо этого. Часто VBS может делать то, что не может делать пакет, или, по крайней мере, делать это намного проще. Используя технику, проиллюстрированную здесь, вы можете смешать их (не «бесшовно», а «функционально» ...)
Вот один вкладыш, чтобы создать временный скрипт, выполнить его, а затем удалить его. Скрипт спит за вас (в этом примере 3 секунды).
echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs
Вот в основном то же самое, написанное немного по-другому:
set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%
И вот наконец-то, вроде бы ping
, у CScript
самого есть опция тайм-аута! Таким образом, если вы введете бесконечный цикл в сценарии, вы можете позволить интерпретатору принудительно установить продолжительность. Обратите внимание, что это «занятая» операция, которая потребляет ресурсы процессора, и поэтому я не рекомендую ее использовать, когда вы можете использовать WScript.Sleep
процедуру, но я представляю ее как концептуальную опцию для полноты картины:
set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%