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

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

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

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

Содержание

История

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

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

  • ERRORLEVEL выставляется после каждой команды, а не только если что-то поломалось. В результате там не болтается код какой-то доисторической ошибки. Бородатые сишники помнят, что ERRORLEVEL - это тот самые return 0 в конце сишной программы. А записывается он в регистр EAX (если под пентиум компилировать)
  • BAT выполнялся DOS-ом (COMMAND.COM), а CMD —— командной строкой Windows (CMD.exe). Но в последних версиях Windows CMD.exe кушает обоих.
  • BAT допиливаться не будет, а CMD может быть.

Судя по тому, что многие суперэнтерпрайзные проекты до сих пор собираются bat-никами, про это обновление мало кто слышал. Хотя разница ныне только в расширении.

Далее MS неустанно пыталась выпилить батник. В OS/2 были REXX скрипты, ныне сохранившиеся только на сайтах олдфагов вроде Каганова. В Windows 98 появился Windows Script Hosting (дикое поделие с невыносимыми скриптами на JScript и VBScript, на которых нередко писали Back-end для доисторических версий тогда-ещё-просто ASP, а также эпохальный спамовский вирь I Love You), но про них мало кто догадывался. Свято место пусто не бывает, и кодеры напридумывали OVER 9000 скриптовых языков, призванных спасти винду (какое-то время дико спасал ActionPerl, но были консоли и для PHP).

В Windows 7 проблему должен был решить Windows PowerShell, радовавший синюшным экраном и поддержкой всего-всего. Увы, из-за идиоткой политики безопасности при попытке запустить из файла даже Hello World система начинала вопить и плеваться непонятными ошибками, погружая кодера в бездну анальной фрустрации.

Так что старина батник жив до сих пор и умирать не собирается. Несмотря на все его недостатки, он действительно позволяет нехило сэкономить время, особенно если тебе приходится постоянно что-то копировать, заливать, обновлять или перезапускать сервисы. Так что если ты программист или админ, не ленись писать батники. Лучше напиши их и ленись по полной, пока твою работу делают роботы.

В случае, если батник не справляется, а писать специальную утилиту нет сил или времени — ставь cygwin, или могучий кроссплатформенный скриптовой язык вроде Perl или Python. Несмотря на свою интернетовскую популярность, тот же Perl изначально делался именно для того, чтобы расширить фатально узкий bash.

Hello, world!

ECHO "Hello, World!"

Плюсы

  • Можно выучить за один день. И сразу что-то написать.
  • Запускается по щелчку мышкой, ничего не требует, совместим со всем что есть от Microsoft-а.
  • Чтобы написать на экране "Нажмите любую клавишу, чтобы продолжить..." и ждать эту клавишу, достаточно написать PAUSE.
  • > сбрасывает в вывод в файл. >> дописывает вывод в конец файла.
  • Есть 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, люби ассемблер.
  • Нет вложенного IF!!!!! То есть IF ELSE писать можно, а IF ELSE внутри IF - хренушки. Поэтому сложное ветвление требует нетривиальных навыков, которые обычно напрочь теряются в момент перехода от Assembler к C. Приходится рисовать блок-схему и прыгать через goto.
  • Параметров командной строки всего 9. %10 - это %1 с ноликом на конце.
  • Уникальный, не имеющий аналогов в мире способ написания комментариев. rem в начале строки комментирует всё, что после. А многострочных комментариев в принципе не бывает.
  • Уникальный, не имеющий аналогов в мире substring через тильду. Как-то так: %~d1%~p1%~n1.mp3
  • "cd %~dp0." - текущей папкой становится папка, где лежит скрипт. Правда, понятно?
  • Если SCRIPT1 дойдёт до строчки SCRIPT2 и SCRIPT2.BAT/SCRIPT2.CMD есть в текущей папке - SCRIPT2 начнётся и больше не вернётся в SCRIPT1. Надо писать EXEC SCRIPT2. Для программ не выполняется.
  • Нету sleep, вместо него предлагается... пинговать какой-нибудь сервер. Этот, с позволения, костыль, встречается в т.ч. и на банкоматах.

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

  • AUTOEXEC.BAT - лежит в корне диска ДОСа и всех старых Виндовз и запускается в самом-самом начале. Запускает драйвера, мышку, keyrus, резидентные вирусы и трояны, устанавливает переменные окружения. Неоднократно переменовывался и переезжал вглубь системы. Настолько культурно значим, что упомянут даже Пелевиным.
  • shutdown -s -t 00 - вырубить комп без предупреждение. Положи этот батник в автозагрузку и получи втык от админа.
  • %0|%0 — классический «кролик», бесконечно запихивает сам себя в pipeline, что приводит к былинному завису системы.
  • Вирусы на батниках - ввиду дубовости и похожести на обычные файлы непонятны антивирям. В древности, когда Windows автоматом запускала autorun.inf с любого носителя, умели даже размножаться. Теоретически же вирусы можно и на Perl-скриптах писать, благо заражение от генерации файла хрен отличишь, а Perl-код не проблема зашифровать. Так что будь бдителен и пиши скрипты своими руками, анон.
  • Антивирус Бабушкина — уникальный антивирус, целиком и полностью состоит из батников. Зловредные конкуренты из всяких касперских моментально занесли его в свои базы.

См. также