Персональные инструменты
Счётчики

BAT

Материал из Lurkmore
Перейти к: навигация, поиск
Not found 2.svgНарод требует хлеба и зрелищ!
Народ требует иллюстраций к статье!
В конце концов, если бы мы хотели почитать, мы бы пошли в библиотеку.

BAT (батник, батяня, ватник, офиц. batch file) — простонародная замена юниксовому bash-у. Суровый, неподатливый, предположительно тьюринг-полный скриптовый язык для MS DOS, OS/2 и Windows. Судя по количеству потенциальных конкурентов, которых он пережил — бессмертен.

Содержание

[править] История

Появился в первых версиях DOS и с тех пор совсем почти не изменился.

Представляет собой обычный такой файл с расширением .bat. Внутри команды для командной строки, записанные в столбик. Вся последующая история батника — это история попыток его уничтожить.

В OS/2 появился CMD (расширение .cmd, иконка точно такая же), имеющий следующие принципиальные отличия:

  • ERRORLEVEL выставляется после каждой команды, а не только если что-то поломалось. В результате там не болтается код какой-то доисторической ошибки. Бородатые сишники помнят, что ERRORLEVEL — это тот самый return 0 внутри функции main(). А записывается он в регистр EAX (если под пентиум компилировать).
  • 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 прямо под виндой.

[править] Итог

Так что старина батник жив до сих пор и умирать не собирается. Несмотря на все его недостатки, он действительно позволяет нехило сэкономить время, особенно если тебе приходится постоянно что-то копировать, заливать, обновлять или перезапускать сервисы. Сабж таки помогает при ваянии всяких (особенно энтерпрайзных) прожектов, завязанных под 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. Традиционная первая строка многих батников.
  • Может принимать параметры командной строки!! Лежат в %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. В новых версиях Винды это пофиксили и можно смело писать так:
@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 — лежит в корне диска ДОСа и всех старых Виндовз и запускается в самом-самом начале. Запускает драйверы, мышку, 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 больше не запускает autorun.inf.

Структура autorun.inf до безобразия проста: [autorun] open=путь_к_вирусу

  • Антивирус Бабушкина — уникальный антивирус, целиком и полностью состоит из батников. Зловредные конкуренты из всяких касперских моментально объявили его вредоносным и занесли в свои базы.

[править] Уголок джедая

Мало кто знает, но современные BATники способны на многое! В арсенале разработчика — возможность так называемой «гибридизации» (например, от почти ламерской [1] до почти православной en.w:Windows Script File) вышеописанного кода batch-скрипта с популярным или не очень языком программирования. Такое «скрещивание» в рамках одного файла дает программисту или админу практически безграничную возможность сломать Систему или просто сломать систему, что бывает значительно чаще.

[править] См. также