Назад | Перейти на главную страницу

Как спать в батнике?

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

Правильный способ засыпания в пакетном файле - использовать timeout команда, представленная в Windows 2000.

Ждать где-то между 29 и 30 секундами:

timeout /t 30

Тайм-аут будет прерван, если пользователь нажмет любую клавишу; однако команда также принимает необязательный переключатель /nobreak, который фактически игнорирует все, что пользователь может нажать, кроме явного CTRL-C:

timeout /t 30 /nobreak

Кроме того, если вы не хотите, чтобы команда печатала обратный отсчет на экране, вы можете перенаправить ее вывод на NUL:

timeout /t 30 /nobreak > NUL

Поскольку это применимо и здесь, я скопирую мой ответ с другого сайта.

Если вы хотите использовать ping, есть способ лучше. Вы захотите проверить связь с несуществующим адресом, поэтому вы можете указать время ожидания с точностью до миллисекунды. К счастью, такой адрес определен в стандарте (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

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

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

Отказ от ответственности: это не "идеальное" решение, так что не удосуживайтесь забивать меня по голове, как делают те, кто рекомендует ping...

По возможности используйте timeout для уверенности. Но, как отмечено в комментариях, это не всегда вариант (например, в неинтерактивном режиме). После этого я согласен, что ping «Клудж», пожалуй, следующий лучший вариант, так как он очень прост. Тем не менее, я предлагаю другой вариант ... Сценарий VB.

В основе этого решения есть все виды приложений помимо этого. Часто 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%