Как спать в командном файле?

Как приостановить выполнение на некоторое время в командном файле Windows между командой и следующей?

4 ответа

Решение

Правильный способ спать в командном файле - это использовать 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

Вы можете спать в пакетном режиме с помощью powershell:

Миллисекунды

powershell -nop -c "& {sleep -m Milliseconds}"

Секунды

powershell -nop -c "& {sleep seconds}"

Вы также можете вставить пинг в localhost. Это займет 4 секунды для завершения (по умолчанию). Некоторые считают это клуджем, но все равно работает довольно хорошо.

Команда:
пинг 127.0.0.1

Отказ от ответственности: это не "идеальное" решение, так что не бейте меня по голове тем же, что и тем, кто рекомендует 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%
Другие вопросы по тегам