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%, Y1 N2.

Однако, можно сделать из команды 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 файлом.

Впрочем, таких утилит много, все имеют свои плюсы и минусы. Выбирайте под конкретную задачу нужный вам способ.

CMD/BAT, генерация случайных чисел.

Применимо к линейке ОС Windows NT, начиная, как минимум с Windows 2000, x86 и x64 версий[прим. ред.]

Командный процессор Windows (CMD) содержит встроенную переменную %RANDOM%, которую можно использовать для генерации случайных чисел.

%RANDOM% генерирует случайное целое число от 0 до 32767 (включительно).

echo %RANDOM%

Диапазон генерируемых чисел можно уменьшить с помощью небольшого лайфхака, команда SET не только устанавливает значение пользовательских переменных окружения, но и может производить простейшие арифметические операции.

Например, можно сгенерировать случайные числа в диапазоне от 1 до 500:

@ECHO OFF
SET /a _rand=(%RANDOM%*500/32768)+1
ECHO Random number: %_rand%

Если попытаться сгенерировать случайные числа больше чем 32767, то это приведет к проблемам, хотя с виду все будет работать. Например, если в вышеприведенном коде заменить 500 на 65536, то это приведет к генерации последовательности «случайных» чисел, которая будет состоять только из нечетных чисел.

Распределение возвращаемых чисел определяется, как диапазоном, так и количеством итераций генерации случайных чисел.

Например, если вы генерируете числа в диапазоне от 1 до 100 то в среднем:

— При генерации 10 чисел, примерно 6% будут дублироваться
— При генерации 100 чисел, этот процент вырастет до 63, т.е. 63% сгенерированных чисел будут дубликатами, т.е. совпадать с одним или несколькими из остальных 99 чисел.
— Если сгенерировать 1000 чисел, почти все будут дублироваться, т.к. есть только 100 возможных значений.

Случайные и псевдослучайные числа

Псевдослучайная последовательность не является истинно случайной и определяется небольшим набором начальных условий.

В случае %RANDOM%, начальное значение зависит от текущего времени (системного таймера), когда произошел запуск экземпляра командного процессора. Это может создать проблему, когда проходит примерно одно и то же время перед обращением к переменной %RANDOM% и запуском самого скрипта, одновременно со стартом экземпляра командного процессора. Возвращаемое число будет находиться в небольшом предсказуемом диапазоне.

В качестве примера создайте файл numbers.cmd, содержащий следующий код:

@Echo off
Echo %RANDOM%

И запустите его следующим образом:

cmd /c numbers.cmd
cmd /c numbers.cmd
cmd /c numbers.cmd
...

Раймонд Чен из MSFT подробно описывает, почему %RANDOM% в cmd.exe не такой уж случайный.

Йоханнес Баагё опубликовал сравнение лучших алгоритмов генерации случайных чисел на javascript. Самый быстрый из них — Alea(), копия которого представлена по ссылкам ниже или в источнике.

Эта реализация имеет ряд преимуществ: можно генерировать числа большие, чем позволяет %RANDOM%, можно быстро сгенерировать много чисел, можно создавать псевдослучайные последовательности, т.е., результаты станут повторяемы, если вы вызовете скрипт с указанием одного и того же начального числа, т.е сами зададите начальные условия.

Впрочем, не стоит использовать эти «случайные числа» для чего-то серьезного, в винде так и нет нормального штатного генератора случайных чисел, и изначально не было. В худшем случае стоит пользоваться библиотеками криптопровайдера, в лучшем — аппаратным генератором. (прим. ред.)

Скрипт random.js на PasteBin
Источник

Перевел Серёга «PTZSnake jr.» Неклюев
Специально для Tolik-punkoff.com
Редактор: Leha Silent

Все права идут нахуй.

Секта хоккеистов, бандеровцы и кот.

Вместе с одногруппником убегали от гопников в районе круглосуточного магазина и дома культуры, и магазин, и ДК и одногрупник существуют в реале. Гопники тоже. Нас от гопников отбил симпатичный высокий блондин лет 17-ти, примерно.

Блондин потом стал нам жаловаться, мол папа мудак, несет какую-то хуйню, заставляет его заниматься хоккеем, хотя ему этот хоккей нахуй не вперся. Я ответил, чтоб он сам думал, и послал нахуй токсичного родителя, и мы с одногруппником пошли домой.

Однако, батя хоккеиста нас перехватил, хотя одногруппник успел свалить, а вот меня батя пацана повел неведомо куда, впрочем, почти добровольно, хотя пару раз дернул за ухо. Да, во сне лет мне было меньше, чем ИРЛ. В итоге, с батей хоккеиста мы зашли в подвал Дома Культуры через неприметную постройку на противоположной стороне дороги.

Ну у них там и накопано было! Какие-то подземные тоннели, целое ледовое поле для хоккея, двери в несколько раздевалок для хоккеистов (в одной из я заметил того самого парня, сына главы секты).

Батя привел меня в свой кабинет, дальше был разговор, правда ли я убеждал его сына послать его нахуй. Я переобулся в воздухе и сказал, что нахуй никого не посылал и не просил, а вот думать самому велел.

Тут этот батя как-то резко смягчился, сказал, «ты нам подходишь, умный парень» и предложил сходить на их собрание, ну как предложил — добровольно-принудительно, впрочем, я пошел и мне даже стало интересно, что за хрень тут творится, и как они без ведома мэрии тут всего понастроили.

Пока шли до зала собраний, я услышал какой-то шум сверху:

— Что это?
— Не беспокойся, это бандеровцы заседают, но они входа к нам не найдут.

Собрание проходило в каком-то совдеповском актовом зале, везде стояли медсестры в белых халатах, куча народа уже заняли места и попивали жидкость, похожую на разбавленный кисель. Меня подозвала медсестра, спросила, новенький ли я, и после утвердительного ответа, усадила меня на стул, перетянула руку жгутом и въебала укол непонятной красной хрени, которая выглядела как кортексифан из сериала Грань (Fringe). Причем медсестра утверждала, что тут все натуральное, это не наркотик, а смесь трав разработанная лидером хоккейной секты.

От укола мне стало реально больно (дальше расскажу почему). А потом началась лекция, где батя хоккеиста втирал хуйню про личностный рост, саморазвитие и преданность компании, в духе инфоцыган. Кстати, легкую эйфорию я тоже испытывал. И если боль я объясню ниже, то как объяснить виртуальный наркотик, я хз. А мне стало тяжело дышать, и мне подали напиток, тот самый разбавленный кисель, мне с него стало легче, но я подумал, что пора валить и тихо съебал, как-то умудрившись найти лестницу наверх.

Далее не помню, походу я к бандеровцам побежал.

Дальше бегаю по лестницам, за мной бегал батя хоккеиста с криками «Предатель, убью», изо всех щелей валит дым, из окон разбитых (бегаем уже не в подвале) тоже валит дым, где-то кого-то пиздят, меня в окно выбрасывает какой-то пацан, я планирую на землю, просыпаюсь. Бандеровцы разгромили хоккейную секту.

Вы спросите, а кот, кот где же?

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

Самое прикольное с научной точки зрения, как реальность происходящего с телом влияет на сюжет сна. Ученых на эту проблему нет :((

И как я немного кайфанул от выдуманного наркотика? Причем сознание явно смешало клюквенный морс, кортексифан из давно просмотренного сериала, и эффект экстази, только во сне более слабый, чем в реальности. Да, пробовал. Верните мне мой 2007-й.

Британские ученые, вы где?

CMD/BAT Переопределение (redirect) STDERR (стандартного потока вывода ошибок) куда-нибудь.

Ну, например, в файл или в nul.

Не знал, что в Windows работает линуксовый синтаксис:

someprogramm.exe parameters 1>nul 2>nul

Или так:

someprogramm.exe parameters >nul 2>nul

1> или > — стандартный поток вывода (STDOUT)
2> — стандартный поток вывода ошибок (STDERR)

Причем, если бы в грозу не вырубило интернет, хрен бы узнал. Никогда не надо было, а тут понадобилось. Психанул и написал как в Линуксе, ВНЕЗАПНО, сработало.

Вовчик Воротов даже куски синтаксиса у никсоидов тырил?