BAT
Народ требует Народ требует иллюстраций к статье! В конце концов, если бы мы хотели почитать, мы бы пошли в библиотеку. |
BAT (батник, батяня, ватник, офиц. batch file) — простонародная замена юниксовому bash-у. Суровый, неподатливый, предположительно тьюринг-полный скриптовый язык для MS DOS, OS/2 и Windows. Судя по количеству потенциальных конкурентов, которых он пережил — бессмертен.
Содержание |
[править] История
Появился в первых версиях DOS и с тех пор совсем почти не изменился.
Представляет собой обычный такой файл с расширением .bat. Внутри команды для командной строки, записанные в столбик. Вся последующая история батника — это история попыток его уничтожить.
В OS/2 появился CMD (расширение .cmd, иконка точно такая же), имеющий следующие принципиальные отличия:
- ERRORLEVEL выставляется после каждой команды, а не только если что-то поломалось. В результате там не болтается код какой-то доисторической ошибки.
- 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. Традиционная первая строка многих батников.
- Есть
%random%
.
- Может принимать параметры командной строки!! Лежат в %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=путь_к_вирусу
- Трояны на батниках — существуют главным образом в воображении завсегдатаев тиречевского /i/. Но трояны с батниками в комплекте всё-таки бывают (к примеру, Trojan.Win32.Powp.rdf). Или вот это дикое быдлокодерское поделие из Ксакепа за 2004 год.
- Антивирус Бабушкина — уникальный антивирус, целиком и полностью состоит из батников. Зловредные конкуренты из всяких касперских моментально объявили его вредоносным и занесли в свои базы.
[править] Свистелки и перделки
Как и у взрослого языка программирования, у батника есть диалекты, интерпретаторы и компиляторы. Каждому интерпретатору соответствует свой диалект BAT:
- Windows NT CMD.EXE — стандартный на сегодняшний день интерпретатор. Диалект мощный, в разделе ниже «Уголок джедая» перечислены некоторые хитрые штуки, которые можно сделать с его помощью,
- DOS COMMAND.COM — старый, кондовый и дубовый стандартный интерпретатор, диалект убог и хром на обе ноги. Во FreeDOS в стандартный комплект поставки входит свой вариант товарища Комманд Кома, мало отличающийся от мелкомягкого.
- 4DOS/NDOS — альтернативный интерпретатор BAT (и своего уникального формата батников BTM), популярный в свое время, а сейчас часто использующийся во FreeDOS. Диалект достаточно мощный, много фич этого командного интерпретатора аналогично Bash.
Компиляторы тоже имеются. С их помощью, да-да, можно скомпилировать батник в .COM или .EXE.
- BAT2EXE — использует виндовый диалект, выдает виндовый EXE-шник.
- TurboBAT — несмотря на название, написан не Borland, а некоей конторкой Hyperware. Досовский компилятор, понимает диалекты товарища Комманд Кома и 4DOS. На выходе досовский .COM.
[править] Уголок джедая
Мало кто знает, но современные BATники способны на многое! В арсенале разработчика — возможность так называемой «гибридизации» (например, от почти ламерской [1] до почти православной en.w:Windows Script File) вышеописанного кода batch-скрипта с популярным или не очень языком программирования. Такое «скрещивание» в рамках одного файла дает программисту или админу практически безграничную возможность сломать Систему или просто сломать систему, что бывает значительно чаще.
[править] См. также
- Антивирус Бабушкина написан на сабже.
- Notepad, в котором пишут сабжи.
- Perl, Python, PHP — скриптовые языки. Они помогут там, где сабж не справится.
- Ватник
- Bash.im
- Всё, что нужно для хорошего батника
[ + ] Любой программист без словаря поймёт, что такое BAT
|
|||||||||
---|---|---|---|---|---|---|---|---|---|
|