BAT

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску

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-никами, про это обновление мало кто слышал. Хотя разница ныне только в расширении.

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

Итог[править]

Так что старина батник жив до сих пор и умирать не собирается. Несмотря на все его недостатки, он действительно позволяет нехило сэкономить время, особенно если тебе приходится постоянно что-то копировать, заливать, обновлять или перезапускать сервисы. Сабж таки помогает при ваянии всяких (особенно энтерпрайзных) прожектов, завязанных под Windows. То есть, минимальную автоматизацию каких-то действий (скопировать, раз-/заархивировать, поднять/остановить, проверить) под Виндой он таки делает, а в 95% случаев больше и не нужно.

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

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

Hello, world![править]

@ECHO OFF
ECHO "H[[ELLO|ello]], World!"

И традиционно в одну строку

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

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

Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикФортран
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёзды
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplace
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCamp
ЛюдиИлья КанторЮрий КлючевскийЭдуард Лаас
Прочее++i + ++iDeadline%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодач
App.png Это не баг, а фича
МетаПрограммаDRM (SecuROMStarForceАналоговая дыра) • БагБот (Автоответчик) • Варез (Repack) • ГлюкГуйДонатКопирайт (By design) • ЛогНюкРут (Не работай под рутом) • Спортивное программированиеМегапиксельКомпьютерВерсия 2.0КодОбфускацияСкриншотДатамайнПлагинТекстовый файлБольшие данныеАльфа и бета-тестыТаймстампКэшШаблоныHello WorldНейросетиФайлИнсталляция
ФичиБагрепорт12309BSODCookiesEmbrace, extend and extinguishFL StudioSheep.exeWinlogon.exeБубенЗащита от дуракаКостыльМашинный переводПасхальные яйцаСвистелки и перделкиСм. рис. 1Съешь ещё этих мягких французских булокTermuxGNU MetroИндусский кодНескучные обои • Сжатие (За сжатие ДжипегаШакалШкала) • Работает — не трогайРандомайзерPDF (Распознавание PDF) • Дело Google в ФАСЧат-ботXMLМакросКритическая ошибка
ВредоносноеБотнетБрутфорсВинлокЗвонилкаКитайские пингвиныПиксель смертиТроянЧервь МоррисаBonziBuddyMediaGetBrowser hijackingTinderМиссис МажорУтечка буфера обмена
КомпанииApple / Apple (AppleScript) • GoogleMicrosoftSAPЯндекс
Движения8-bitOpen source (КрасноглазикиЛинуксоиды) • Вирусная сценаДаунгрейдДемосценаМоддингMMD
Офис3DS MAXGIMPGNU EmacsMovie MakerMS Paint • OpenOffice • PowerPointviMicrosoft WordExcelБлокнотФотошопАнтивирус КасперскогоAvast!TikZShareXAlternativeToСкрепышMicrosoft OfficeТекстовый редакторWeChat
ОСAndroidBSDDOSMenuetOSReactOSWindows (Phone 7Phone 878Vista) / МаздайЛинуксРусская ОСФантом ОС
БраузерыInternet ExplorerОпера / Opera • Тормозилла (ОгнелисLolifoxMozilla FirefoxFirefoxFirefox Klar) • Хром (шпионаж) • SafariЯндекс.БраузерУведомления в браузереVivaldiTor-браузер
ИнтернетAdobe Systems (Flash) • I2PLow Orbit Ion CannonTorTunatic • Чат−клиенты (MirandaQIPSkypeАськаЖабберDiscordVIPole) • HTTPSПрокси-сервер (Proxifier) • Торрент (Magnet-ссылкаΜTorrent) • JavaScriptCSSHTMLБаннермейкерИзменение TTL сетевых пакетовКапчаICQFiddlerViberZonaSteamSillyTavernWickr Me
РазработкаBrainFuckCC++C#JavaHaskellАссемблерChaos ConstructionsBATMySQLGitHubAutoHotKey (AutoHotInterception) • Sublime TextAPK (APKPureзапрет) • BASICPerlPythonPHPФорк
ЛюдиВеб-мастерLovinGODБалмерГейтсГенерал ФейлорДжобсМитникПоттерингде РаадтСпольскиСтоллманТорвальдсШахиджанянAche666Марк ЦукербергЕвгений ПоповДенис КумпонМассовая компьютерная безграмотность
КостылиCygwin • PunkBusterT9WineWishmasterАнтивирусыХакинтошСборки WindowsDenuvoЧистая установкаКалькулятор Consul WarMicrosoft StoreUBlock OriginLightshotAdBlockSearchApp.exeCPU-Z
Команды^H^WAlt+F4Ctrl+Alt+Delman/me/quitrm -rf