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.» — текущей папкой становится папка, где лежит скрипт. Правда, понятно?
  • Если SCRIPT1 дойдёт до строчки SCRIPT2 и SCRIPT2.BAT/SCRIPT2.CMD есть в текущей папке — SCRIPT2 начнётся и больше не вернётся в SCRIPT1. Надо писать CALL SCRIPT2. Для программ не выполняется.
  • Нету sleep, вместо него предлагается… пинговать какой-нибудь сервер. Этот, с позволения, костыль встречается в том числе и на банкоматах.

Знаменитые батники

  • 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-код не проблема зашифровать. Так что будь бдителен и пиши скрипты своими руками, анон.
  • Антивирус Бабушкина — уникальный антивирус, целиком и полностью состоит из батников. Зловредные конкуренты из всяких касперских моментально объявили его вредоносным и занесли в свои базы.

См. также


Источник — «http://lurkmore.to/BAT»