BAT/CMD. Задержка (тайм-аут), пауза, аналог команды sleep Linux в DOS/Windows
Почему-то Вовчик Воротов еще со времен DOS не мог в командный процессор добавить встроенную команду
sleep
<секунд>, которая обеспечивает паузу в скрипте BAT/CMD, как это делается в том же bash. Но есть насколько решений.CHOICE
.Совместимость: командные процессоры, начиная с DOS 6.00, включая все версии Windows.
Утилита
CHOICE.EXE
изначально предназначена для запроса ответа пользователя (Да/нет), например, вызов командыchoice /M "Request Text"
где,
"Request Text"
- текст вопросаотобразит в консоли следующее:
Request Text [Y,N]?
Пользователь должен будет нажать клавишу
Y
или N
, код возврата можно будет отследить в BAT-скрипте в переменной %ERRORLEVEL%
, Y
- 1
N
- 2
.Однако, можно сделать из команды
CHOICE
задержку в скрипте, используя следующий синтаксис:choice /T [секунд] /D [любой_символ] >nul
где,
/T [секунд]
- включить задержку на [секунд]
секунд./D [любой_символ]
- ответ по умолчанию (без него не будет работать параметр /T
).>nul
- отправить вывод сообщения команды в >nul
, дабы не загрязнять вывод скрипта.Например:
choice /T 1 /D y >nul
установит задержку в одну секунду.
+ Максимально совместимая команда, начиная с DOS 6.00.
- Не является встроенной командой, может отсутствовать в сборках Windows/DOS или образах Windows PE/загрузочных образах DOS
- Команда может спровоцировать зависание скрипта на неопределенный срок, если скрипт был вызван в определенных условиях, когда командный процессор
cmd.exe
был вызван иным приложением Windows, выполняющим перехват STDOUT
консоли.Справка по команде
TIMEOUT
Совместимость: Windows 7 и выше.
Синтаксис:
timeout /T [секунд]
или
timeout [секунд]
где,
[секунд]
- время в секундах.+ К Windows 7 Вовчик Воротов таки озаботился командой, позволяющей делать стандартную задержку в BAT-скриптах.
- Нет в более ранних версиях Windows и DOS
- Если BAT-файл запущен в приложении, перехватывающем
STDOUT
(консольный вывод), могут случиться необоснованные глюки.- Не является встроенной командой, может отсутствовать в сборках Windows или образах Windows PE
Пример:
timeout /T 1 >nul
Справка по команде
WAITFOR
Совместимость: Windows 7 Professional и выше.
Вообще эта команда предназначена для другого, она отправляет или ожидает системного сообщения. Примерно того же, чем являются системные сообщения в Linux, например
SIGTERM
и SIGKILL
, хотя и весьма условно - в Windows они устроены несколько по-другому. Если программе указать заведомо несуществующее системное сообщение и время ожидания - программа сработает как пауза в BAT/CMD скрипте:waitfor /T [время] [сообщение(строка)] 1>nul 2>nul
где,
/T [время]
- [время]
время ожидания, секунд.[сообщение(строка)]
- можно использовать любую случайную строку, не совпадающую с известными системными сообщениями.1>nul
- перенаправление стандартного потока вывода (STDOUT
) в устройство nul
.2>nul
- перенаправление стандартного потока ошибок (STDERR
) в устройство nul
.Два последних переопределения используются для того, чтобы не замусоривать вывод скрипта.
Пример (скрипт будет ожидать 1 секунду):
waitfor /T 1 zhzhz 1>nul 2>nul
+ Не вызывает зависаний при перехвате консольного вывода скрипта внешним приложением
- Нет в более ранних версиях Windows/DOS
- Не является встроенной командой, может отсутствовать в сборках Windows или образах Windows PE
Справка по команде
ping
Совместимость: DOS, с установленными программами поддержки сети, все версии Windows
ping
на locallhost
можно использовать, как команду для задержки в BAT-файле. Хотя, этот способ не рекомендуется использовать, т.к. время задержки может отличаться в зависимости от количества отправленных пакетов, "железа" компьютера или версии ОС.Пример:
ping -n 3 127.0.0.1 >nul
127.0.0.1
- IP-адрес localhost
-n 3
, т.е. 3 пакета отправленные на localhost
дают примерное время ожидания в 1 секунду на Windows 7, на ноутбуке HP Pavilion+ Есть во всех версиях Windows/DOS где есть стандартная поддержка сети от MS
+ При перехвате
STDOUT
не глючит- Время задержки определяется весьма приблизительно.
Самостоятельных реализаций sleep/timeout написана вагон и маленькая тележка. Например, одну из них можно скачать на GitHub:
sleep (console application)
Запуск:
sleep <секунд>
Пример:
sleep 1 >nul
+ Сбоев не обнаружено
+ Совместимость: Все версии Windows x86/x64
+ Имеются исходники, можно пересобрать под DOS при наличии компилятора Freepascal.
- Внешняя нестандартная утилита, придется таскать вместе с BAT/CMD файлом.
Впрочем, таких утилит много, все имеют свои плюсы и минусы. Выбирайте под конкретную задачу нужный вам способ.
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/08/02/bat-c