Як призупинити виконання на деякий час у пакетному файлі 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
просто неправильний інструмент для роботи.
Ви також можете вставити ping до localhost. На це знадобиться 4 секунди (за замовчуванням). Деякі вважаються хитрістю, але все-таки добре працює.
Команда:
ping 127.0.0.1
ping
поставляється він із вашою ОС. Якщо ви стурбовані досить про '95 '98 або ME , то ви повинні бути в рівній мірі стурбовані 6.22 , яка не має ping
ні
Відмова від відповідальності : це не "ідеальне" рішення, тому не турбуйте мене над головою, як це робиться тим, хто рекомендує 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%