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

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

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