Участник:Счастливый Будильник/BAT

Материал из Lurkmore

Перейти к: навигация, поиск
Recycle.pngЭта статья находится на доработке.
Эта статья всё ещё не взлетела и не соответствует нынешним реалиям /lm/. Но добрый Счастливый Будильник приютил её в своём личном пространстве, и теперь она может тихо гнить неспешно дописываться здесь вечно.Дата последней правки страницы: 17.08.2014

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

Содержание

История

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

В 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 система начинала вопить и плеваться непонятными ошибками, погружая кодера в бездну анальной фрустрации.

Итог

Так что старина батник жив до сих пор и умирать не собирается. Несмотря на все его недостатки, он действительно позволяет нехило сэкономить время, особенно если тебе приходится постоянно что-то копировать, заливать, обновлять или перезапускать сервисы. Сабж таки помогает при ваянии всяких (особенно энтерпрайзных) прожектов, завязанных под 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 %sevicename%. Дико удобно для разработчика интерпрайза, который на них завязан.
  • Два вида FOR - FOREACH и по числам. Оба дубовые и неудобные.

Минусы

  • Ввиду древности, стандарт (и парсер) дико дубовы. Та же болезнь, что у bash-а: лишний пробел перед знаком равенства породит ошибку.
  • Переменные, по сути, не переменные, а макросы. То есть SET reviewer = nomad — это не присвоить текстовое значение переменной, а заменять дальше по тексту все вхождения %reviewer% на nomad. Чтобы присвоить переменной другую переменную, надо писать set /a.
  • Типов данных нет и в помине. Есть один тип — команда.
  • Нет процедур. Да, здесь вам не bash. Если нужна подпрограмма — пиши GOTO и :метки, люби ассемблер. Можно, правда, написать call, имя другого батника и параметры. Какое-никакое, а облегчение.
  • Нет вложенного IF!! То есть IF ELSE писать можно, а IF ELSE внутри IF - хренушки. Прямо как в доисторических версиях Pascal, так что про структурное программирование забудьте. Любое сложное ветвление требует нетривиальных навыков, которые обычно напрочь теряются в момент перехода от Assembler к C. Приходится рисовать блок-схему и прыгать через GOTO.
  • Параметров командной строки всего 9. %10 - это %1 с ноликом на конце. Хочешь больше — будь добр использовать слово SHIFT, и не раз.
  • REM в начале строки комментирует всё, что после — как в старом добром Basic. А многострочных комментариев в принципе не бывает.
  • Уникальный, не имеющий аналогов в мире substring через тильду. Как-то так: %~d1%~p1%~n1.mp3.
  • "cd %~dp0." —- текущей папкой становится папка, где лежит скрипт. Правда, понятно?
  • Если SCRIPT1 дойдёт до строчки SCRIPT2 и SCRIPT2.BAT/SCRIPT2.CMD есть в текущей папке — SCRIPT2 начнётся и больше не вернётся в SCRIPT1. Надо писать CALL SCRIPT2. Для программ не выполняется.

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

  • AUTOEXEC.BAT — лежит в корне диска ДОСа и всех старых Виндовз и запускается в самом-самом начале. Запускает драйвера, мышку, keyrus, резидентные вирусы и трояны, устанавливает переменные окружения. Неоднократно переменовывался и переезжал вглубь системы. Настолько культурно значим, что упомянут даже Пелевиным.
  • shutdown -s -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-код не проблема зашифровать. Так что будь бдителен и пиши скрипты своими руками, анон.
  • Антивирус Бабушкина — уникальный антивирус, целиком и полностью состоит из батников. Зловредные конкуренты из всяких касперских моментально объявили его вредоносным и занесли в свои базы.

См. также