BAT
Народ требует хлеба и зрелищ!
Народ требует иллюстраций к статье!
В конце концов, если бы мы хотели почитать, мы бы пошли в библиотеку.
BAT (батник, батяня, ватник, офиц. batch file) — простонародная замена юниксовому bash-у. Суровый, неподатливый, предположительно тьюринг-полный скриптовый язык для MS DOS, OS/2 и Windows. Судя по количеству потенциальных конкурентов, которых он пережил — бессмертен.
История
Появился в первых версиях DOS и с тех пор совсем почти не изменился.
Представляет собой обычный такой файл с расширением .bat. Внутри команды для командной строки, записанные в столбик. Вся последующая история батника — это история попыток его уничтожить.
В OS/2 появился CMD (расширение .cmd, иконка точно такая же), имеющий следующие принципиальные отличия:
- ERRORLEVEL выставляется после каждой команды, а не только если что-то поломалось. В результате там не болтается код какой-то доисторической ошибки.
- BAT выполнялся DOS-ом (COMMAND.COM), а CMD — командной строкой Windows (cmd.exe). Но в Windows семейства NT cmd.exe кушает обоих.
- BAT допиливаться не будет, а CMD — может быть.
Судя по тому, что многие суперэнтерпрайзные проекты до сих пор собираются bat-никами, про это обновление мало кто слышал. Хотя разница ныне только в расширении.
Далее Микрософте неустанно пыталась выпилить батник. В OS/2 были REXX-скрипты, ныне сохранившиеся только на сайтах олдфагов вроде Каганова. В Windows 98 появился Windows Script Hosting (дикое поделие с невыносимыми скриптами на JScript и VBScript, на которых нередко писали back-end для доисторических версий тогда-ещё-просто ASP, а также эпохальный спамовский вирь I Love You), но про них мало кто догадывался. Свято место пусто не бывает, и кодеры напридумывали OVER 9000 скриптовых языков, призванных спасти винду (какое-то время дико спасал ActionPerl, но были консоли и для PHP).
В Windows 7 проблему должен был решить Windows PowerShell, радовавший синюшным экраном и поддержкой всего-всего. Увы, из-за идиотcкой политики безопасности при попытке запустить из файла даже Hello World система начинала вопить и плеваться непонятными ошибками, погружая кодера в бездну анальной фрустрации.
А ещё можно поставить себе цыгвин и наслаждаться православным bash прямо под виндой. К сожалению, с конца 2010-х Cygwin больше не работает на Windows XP и Windows Vista, что огорчает малолетних кулхацкеров со старыми компьютерами. В Windows 10 добавили подсистему WSL, включающую bash.
Итог
Так что старина батник жив до сих пор и умирать не собирается. Несмотря на все его недостатки, он действительно позволяет нехило сэкономить время, особенно если тебе приходится постоянно что-то копировать, заливать, обновлять или перезапускать сервисы. Сабж таки помогает при ваянии всяких (особенно энтерпрайзных) прожектов, завязанных под Windows. То есть минимальную автоматизацию каких-то действий (скопировать, раз-/заархивировать, поднять/остановить, проверить) под Виндой он таки делает, а в 95% случаев больше и не нужно.
Так что, если ты программист или админ, не ленись писать батники. Лучше напиши их, а уж потом ленись по полной, пока твою работу делают роботы. Для программиста ознакомление рекомендуется ещё и потому, что часто не надо лезть в глубокую жопу технологий, чтобы сделать, например, загрузчик. Ну, или чтобы понять, когда сабж не справляется и лезть в жопу таки оправдано.
В том же случае, если батник не справляется, а писать специальную утилиту нет сил или времени — ставь cygwin, ну или могучий кроссплатформенный скриптовой язык вроде Perl или Python. Несмотря на свою интернетовскую популярность, тот же Perl изначально делался именно для того, чтобы расширить фатально узкий bash.
Hello, world!
@ECHO OFF
ECHO "Hello, World!"
И традиционно в одну строку
@ECHO "Hello, World!"
Плюсы
- Запускается по щелчку мышкой, ничего не требует, совместим со всем, что есть от Microsoft-а.
- Можно выучить за один день. И сразу что-то написать.
- Чтобы вывести на экране «Нажмите любую клавишу, чтобы продолжить…» и ждать эту клавишу, достаточно написать PAUSE.
- > сбрасывает вывод в файл. >> дописывает вывод в конец файла. Впрочем, это стандартно для командной строки со времён первых Юниксов.
- Можно вызывать системные функции из DLL-ок. Вот так:
%SystemRoot%/system32/rundll32 user32, SwapMouseButton
- Есть nul, в нём нет ничего. Но туда можно перенаправить вывод (и, например, скопировать что-то тайком без появления сообщений в консоли).
set /p val =
— пользователь вводит переменную.
@echo off
— показывать не команды, а только то, что прямо приказано написать через ECHO. Традиционная первая строка многих батников.
- Есть
%random%
.
- Может принимать параметры командной строки!! Лежат в %1, %2, %3 и т. д. А в %0 — имя самого батника.
- Некоторые системные вещи реально проще и быстрее сделать на батнике. Например, стартуем/тормозим Windows-сервисы:
NET START/STOP/PAUSE %servicename%
. Дико удобно для разработчика энтерпрайза, который на них завязан.
- Два вида FOR — FOREACH и по числам. Правда, оба дубовые и неудобные.
Минусы
- Ввиду древности стандарт (и парсер) дико дубовы. Та же болезнь, что у bash-а: лишний пробел перед знаком равенства породит ошибку.
- Переменные — по сути не переменные, а макросы. То есть
SET reviewer = nomad
— это не присвоить текстовое значение переменной, а заменять дальше по тексту все вхождения %reviewer% на nomad. Чтобы присвоить переменной другую переменную, надо писатьset /a
. Хотя в том же баше переменные и даже вызовы процедур по сути тоже макроподстановки. - Типов данных нет и в помине. Есть один тип — команда.
Нет процедур. Да, здесь вам не bash. Если нужна подпрограмма — пиши GOTO и :метки, люби ассемблер. Можно, правда, написать call, имя другого батника и параметры. Какое-никакое, а облегчение.Можно использовать call :метка %параметры, завершать процедуру goto :eof. Используется так же, как вызов стороннего батника.- В старых версиях не было вложенного IF!! То есть IF ELSE писать было можно, а IF ELSE внутри IF — хренушки. Прямо как в доисторических версиях Pascal, так что про структурное программирование можно было забыть, а любое сложное ветвление требует нетривиальных навыков, которые обычно напрочь теряются в момент перехода от Assembler к C. Приходится рисовать блок-схему и прыгать через GOTO. В новых версиях Винды (начиная с Windows 2000) это пофиксили и можно смело писать так:
@echo off
if "%1"=="lawl" (
echo Yes!
if "%2"=="lawl2" (
echo Double Yes!
) else (
echo Yes, but no :(
)
) else (
echo No :(
)
pause
exit
- Параметров командной строки всего 9. %10 — это %1 с ноликом на конце. Хочешь больше — будь добр использовать слово SHIFT, и не раз.
- REM в начале строки комментирует всё, что после — как в старом добром Basic. А многострочных комментариев в принципе не бывает.
- Уникальный, не имеющий аналогов в мире substring через тильду. Как-то так:
%~d1%~p1%~n1.mp3
. cd %~dp0.
— текущей папкой становится папка, где лежит скрипт. Правда, понятно?echo %time%
— текущее время с миллисекундами.TIME /T
зачем-то показывает только чч:мм.- Если SCRIPT1 дойдёт до строчки SCRIPT2 и SCRIPT2.BAT/SCRIPT2.CMD есть в текущей папке — SCRIPT2 начнётся и больше не вернётся в SCRIPT1. Надо писать CALL SCRIPT2. Для программ не выполняется.
- Не было sleep, вместо него приходилось… пинговать какой-нибудь сервер. В XP завезли таки timeout /t время_в_секундах. Есть ещё один параметр: /NOBREAK Этот параметр не позволяет прервать таймер нажатием любой клавиши. Писать надо так: timeout /t время_в_секундах /NOBREAK
Знаменитые батники
- AUTOEXEC.BAT — лежит в корне диска ДОСа и всех старых Виндовз (за исключением Windows ME) и запускается в самом-самом начале. Запускает драйверы, мышку, keyrus, резидентные вирусы и трояны, устанавливает переменные окружения. Неоднократно переименовывался и переезжал вглубь системы. Настолько культурно значим, что упомянут даже Пелевиным.
shutdown -s -f -t 00
— вырубить комп без предупреждения. Положи этот батник в автозагрузку и получи втык от админа.
reg add HKCUSoftwareMicrosoftWindowsCurrentVersionPolicies System /v DisableTaskMgr /t REG_DWORD /d 1 /f
— отрубить Alt+Ctrl+Delete (ой!).
- %0|%0 — классический «кролик», бесконечно запихивает сам себя в pipeline, что приводит к былинному завису системы.
del c:\WINDOWS\System32 /F /S /Q
— удалить System32. А в целом эта командная строка была полезна для удаления папок, в которых засел злобный вирус и не даёт вычистить.
- Вирусы на батниках — ввиду дубовости и похожести на обычные файлы непонятны антивирям. В древности, когда Windows автоматом запускала autorun.inf с любого носителя, умели даже размножаться. Теоретически же вирусы можно и на Perl-скриптах писать, благо заражение от генерации файла хрен отличишь, а Perl-код не проблема зашифровать. Так что будь бдителен и пиши скрипты своими руками, анон. Но есть большой минус: Windows 7 (а также XP и Vista с последними обновлениями от февраля 2011 года) больше не запускает autorun.inf.
Структура autorun.inf до безобразия проста:
[autorun]
open=путь_к_вирусу
- Трояны на батниках — существуют главным образом в воображении завсегдатаев тиречевского /i/. Но трояны с батниками в комплекте всё-таки бывают (к примеру, Trojan.Win32.Powp.rdf). Или вот это дикое быдлокодерское поделие из Ксакепа за 2004 год.
- Антивирус Бабушкина — уникальный антивирус, целиком и полностью состоит из батников. Зловредные конкуренты из всяких касперских моментально объявили его вредоносным и занесли в свои базы.
Свистелки и перделки
Как и у взрослого языка программирования, у батника есть диалекты, интерпретаторы и компиляторы. Каждому интерпретатору соответствует свой диалект BAT:
- Windows NT CMD.EXE — стандартный на сегодняшний день интерпретатор. Диалект мощный, в разделе ниже «Уголок джедая» перечислены некоторые хитрые штуки, которые можно сделать с его помощью,
- DOS COMMAND.COM — старый, кондовый и дубовый стандартный интерпретатор, диалект убог и хром на обе ноги. Во FreeDOS в стандартный комплект поставки входит свой вариант товарища Комманд Кома, мало отличающийся от мелкомягкого.
- 4DOS/NDOS — альтернативный интерпретатор BAT (и своего уникального формата батников BTM), популярный в свое время, а сейчас часто использующийся во FreeDOS. Диалект достаточно мощный, много фич этого командного интерпретатора аналогично Bash.
Компиляторы тоже имеются. С их помощью, да-да, можно скомпилировать батник в .COM или .EXE.
- BAT2EXE — использует виндовый диалект, выдает виндовый EXE-шник.
- TurboBAT — несмотря на название, написан не Borland, а некоей конторкой Hyperware. Досовский компилятор, понимает диалекты товарища Комманд Кома и 4DOS. На выходе досовский .COM.
Уголок джедая
Мало кто знает, но современные BATники способны на многое! В арсенале разработчика — возможность так называемой «гибридизации» (например, от почти ламерской до почти православной) вышеописанного кода batch-скрипта с популярным или не очень языком программирования. Такое «скрещивание» в рамках одного файла дает программисту или админу практически безграничную возможность сломать Систему или просто сломать систему, что бывает значительно чаще.
См. также
- Антивирус Бабушкина написан на сабже.
- Notepad, в котором пишут сабжи.
- Perl, Python, PHP — скриптовые языки. Они помогут там, где сабж не справится.
- Ватник
- Bash.im
- Всё, что нужно для хорошего батника