CMD/BAT: Различия между .cmd и .bat в Windows










Когда-то давно я задался вопросом «в чем разница между этими расширениями в последних версиях Windows«. Делаю акцент именно на этом, потому что встречаются весьма частые ответы о том, что
— .bat для COMMAND.COM, а .cmd для CMD.EXE
— .bat это в Windows, а .cmd — это в OS/2
Все это далеко от ответов на поставленный вопрос. А ответ есть — https://stackoverflow.com/a/148991/3627676:
The differences between .CMD and .BAT as far as CMD.EXE is concerned are: With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL only on errors.
Различия между .CMD и .BAT в CMD.EXE следующие: при включенной опции ENABLEEXTENSIONS, встроенные команды PATH/APPEND/PROMPT/SET/ASSOC в .CMD файлах выставляют собственный код ошибки в ERRORLEVEL независимо от ошибки. .BAT файлы выставляют код ошибки в ERRORLEVEL только в случае ошибки.
Проиллюстрирую сказанное простым примером — скрипт вызывает несуществующую команду (естественно, не находит ее) и печатает строку подсказки. После первой команды выставляется код ошибки 9009, который мы отображаем сразу после вызова и после встроенной команды
@echo off non-existing-command echo:After wrong command : %errorlevel% prompt echo:After prompt command : %errorlevel%
Вывод .bat файла: команда prompt оказалась «прозрачной» для %ERRORLEVEL%
'non-existing-command' is not recognized as an internal or external command, operable program or batch file. After wrong command : 9009 After prompt command : 9009
Вывод .cmd файла: здесь очевидно, что команда вернула свой код ошбки (ноль) и затерла код ошибки предыдущей команды
'non-existing-command' is not recognized as an internal or external command, operable program or batch file. After wrong command : 9009 After prompt command : 0
Различия незначительные, но могут попортить нервов на поиски решения проблемы в случае скрипта, аналогичном примеру. Этот пример лишний раз говорит в пользу первичной инициализации состояния и переменных.
Посмотрел описание команд — туманно и рекурсивно (сепульки и сепулькарии), а про код ошибки — ни слова.
setlocal /? пишет:
. . . ENABLEEXTENSIONS / DISABLEEXTENSIONS enable or disable command processor extensions. These arguments takes precedence over the CMD /E:ON or /E:OFF switches. See CMD /? for details. . . .
cmd /? пишет:
. . . See SETLOCAL /? for details. . . . To get specific details, type commandname /? to view the specifics.
prompt /? пишет:
Changes the cmd.exe command prompt. . . . If Command Extensions are enabled the PROMPT command supports the following additional formatting characters: . . .
Bat и cmd в чем отличие
Здравствуйте, Аноним, Вы писали:
А>Есть ли разница между cmd и bat?
А что ты называешь «cmd» и что «bat»
Например, если в консоле набрать
C:\>Cmd /?
То консоль скажет (например)
Starts a new instance of the Windows XP command interpreter
и ещё несколько страниц информации, а вот если в консоли сказать
C:\>Bat /?
то консоль ответит
'Bat' is not recognized as an internal or external command, operable program or batch file.
Это ответ на вопрос
Help will always be given at Hogwarts to those who ask for it.
Re[2]: В чем разница между cmd и bat?
| От: | Аноним |
| Дата: | 29.09.09 06:42 |
| Оценка: |
_FR>А что ты называешь «cmd» и что «bat»
Расширение у файлов с командами в винде — *.bat и *.cmd
Есть ли разница?
Re[3]: В чем разница между cmd и bat?
| От: | Dzirt2005 | |
| Дата: | 29.09.09 07:01 | |
| Оценка: | 4 (1) | |
Здравствуйте, Аноним, Вы писали:
А>Расширение у файлов с командами в винде — *.bat и *.cmd
А>Есть ли разница?
Иногда есть. Например:
@echo off rem ------------------------------------------------------------------------- rem The differences between .CMD and .BAT as far as CMD.EXE is concerned are: rem rem With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD rem files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL rem only on errors. rem ------------------------------------------------------------------------- set a= call :seterr echo errorlevel: %errorlevel% set a= echo errorlevel: %errorlevel% set a= call :seterr echo errorlevel: %errorlevel% set a=irgendwas echo errorlevel: %errorlevel% set a=igendwas call :seterr echo errorlevel: %errorlevel% set a= echo errorlevel: %errorlevel% goto :eof :seterr exit /b 10
Re[4]: В чем разница между cmd и bat?
| От: | Vain | google.ru |
| Дата: | 29.09.09 08:28 | |
| Оценка: |
Здравствуйте, Dzirt2005, Вы писали:
А>>Расширение у файлов с командами в винде — *.bat и *.cmd
А>>Есть ли разница?
D>rem The differences between .CMD and .BAT as far as CMD.EXE is concerned are:
Интересная говнофича.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: В чем разница между cmd и bat?
| От: | byleas | |
| Дата: | 05.10.09 12:19 | |
| Оценка: | +1 | |
В чем разница между BAT и CMD файлами?
В операционной системе Windows Vista разницы между bat-файлами и cmd-файлами практически нет. Файлы как с тем, так и с другим расширением обрабатываются при помощи командной строки cmd.exe. В предыдущих же версиях Windows bat-файлы обрабатывались командной строкой command.com. Данная командная строка не поддерживает всех возможностей cmd.exe, поэтому правильнее создавать cmd-файлы (особенно если вы собираетесь использовать их не только на операционной системе Windows Vista).
В самом простом случае bat-файл содержит в себе просто несколько команд запуска программ, каждая из которых записана с новой строки. Например, ниже представлен пример простого bat-файла, запускающего две программы: regedit.exe и calc.exe. При этом программы запускаются последовательно. То есть, пока не будет завершена первая команда bat-файла, не начнется выполнение второй команды.
Regedit.exe
Calc.exe
Более сложные примеры bat-файлов используют специальные программы командной строки cmd.exe, которые позволяют добиться взаимодействия между различными программами, а также их непоследовательного запуска. Далее мы рассмотрим эти программы.
Некоторые символы в bat-файлах имеют особое назначение, поэтому их нельзя использовать в строках, не обрамленных кавычками. Например, к таким символам относятся следующие символы: ( ) < >^ & |.
Bat-файлы — их создание и команды
Рассмотрим мощный инструмент автоматизации рутинных задач в семействе операционных систем Windows.

Рассмотрим мощный инструмент автоматизации рутинных задач в семействе операционных систем Windows.
Что такое bat-файлы?
BAT-файл — это последовательность команд для интерпретатора командной строки в виде текстового файла с расширением .bat или .cmd. Основное предназначение пакетных файлов — автоматизация рутинных действий пользователя компьютера.
Название BAT появилось от английского batch — пакетная обработка. В истории продуктов Microsoft пакетные файлы существовали с первой версии MS-DOS в 80-х годах и позже успешно интегрировались в Microsoft Windows. В MS-DOS командным интерпретатором выступает COMMAND.COM, а начиная с Windows NT и до сих пор используется CMD.EXE.
Интерпретатор COMMAND.COM принимает файлы с расширением .BAT. Расширение .CMD создано для интерпретатора CMD.EXE с целью различать файлы для «старого» и «нового» интерпретаторов. CMD.EXE корректно обрабатывает оба расширения.
Интерпретатор CMD.EXE является частью современных операционных систем семейства Microsoft Windows, несмотря на отсутствие развития с начала 2000-х.
Основы взаимодействия с bat-файлами
Пакетный файл bat — это текстовый документ со специальным расширением. Для создания своего первого bat-файла достаточно «Блокнота», который доступен в операционной системе. Для повышения удобства написания и поддержки bat-файлов рекомендуем использовать Notepad++ или любой другой текстовый редактор с подсветкой синтаксиса.
Создание bat-файлов
Для создания пакетных файлов необходимо открыть текстовый редактор и в меню Файл выбрать Сохранить как….
В появившемся окне выбрать Тип файла → Все файлы и задать имя с расширением .bat, как продемонстрировано на изображении выше. По умолчанию Windows скрывает расширения файлов, и пакетный файл можно отличить от текстового по пиктограмме окна с шестеренками.
Если вы ошиблись при сохранении и пакетный файл сохранился с расширением txt, то не обязательно совершать повторное сохранение. Можно включить отображение расширения имен файлов и переименовать файл.
Запуск bat-файлов
Запуск пакетных файлов производится двойным кликом по иконке. Дополнительно можно использовать команду Открыть из контекстного меню, которое доступно при нажатии правой клавиши мыши (ПКМ) по файлу. Если для выполнения команд требуются права администратора, то в том же контекстном меню есть пункт Запуск от имени администратора.
Исполняемые bat-файлы не могут запрашивать права администратора, если командам нужны расширенные права.
Запуск через контекстное меню откроет командный интерпретатор, в котором выполнятся команды bat-файла. По завершении команд окно закроется. Такое поведение неприемлемо, если от пакетного файла требуется какая-то обратная связь — например, сообщение об ошибке или результат вычислений. В таком случае интерпретатор следует запустить вручную и передать ему пакетный файл.
Для запуска интерпретатора командной строки необходимо открыть меню Выполнить сочетанием клавиш Win + R, вписать cmd и нажать ОК.
Для запуска пакетного файла его необходимо перенести мышкой в открывшееся окно и нажать Enter. Команды bat-файла будут выполнены, а его вывод вы увидите на экране.
Скрытый запуск
Вне зависимости от способа запуска откроется окно, которое может привлекать внимание и раздражать. Для запуска в «скрытом» режиме необходимо использовать другой скриптовой язык Microsoft Windows — VBScript.
По аналогии создаем файл с расширением .vbs и заполняем его следующими командами:
Set WshShell = CreateObject("WScript.Shell") WshShell.Run chr(34) & "С:\путь\до\вашего\скрипта.bat" & Chr(34), 0 Set WshShell = Nothing
Для скрытого запуска следует запускать созданный файл, а не bat-файл. Скрытый запуск bat-файла актуален для автоматизации действий по расписанию, например, создание резервной копии.
Запуск по расписанию
За выполнение действий по расписанию отвечает Планировщик заданий. Открываем меню Выполнить и запускаем программу taskschd.msc.
Выбираем пункт Создать простую задач и заполняем параметры задания:
- имя для простой идентификации,
- периодичность и время запуска,
- действие — Запустить программу,
- программа или сценарий — путь до вашего .bat-файла или .vbs-файла, который запускает .bat-файл скрытно.




Обратите внимание, что планировщик позволяет не только выполнять действие по времени, но и при наступлении события — например, при загрузке компьютера. Такой подход является альтернативой автозагрузке.
В случае разработки собственного bat-файла следует ознакомиться с основами командного интерпретатора.
Команды и синтаксис пакетных файлов
Командный интерпретатор выполняет команды из файла последовательно — строка за строкой. Исключение составляет только оператор GOTO, который «отправляет» к указанной строке. Командный интерпретатор выполняет два вида команд: встроенные команды и внешние исполняемые файлы.
Внешние исполняемые файлы — это любой исполняемый файл, то есть с расширением EXE, CMD или BAT, который доступен в операционной системе. Например, «Блокнот» — это исполняемый файл notepad.exe. Следующая команда приведет к запуску этого приложения с открытым файлом C:\1.txt:
notepad.exe C:\1.txt
Аргументом может быть не только путь, но и ключ — специальный аргумент, который начинается с символа слэш (/). У каждой программы свой «реестр» ключей и их значений.
Обратите внимание, что не все внешние команды «понимают» аргументы, переданные из интерпретатора командной строки. Например, исполняемый файл приложения калькулятор, calc.exe, игнорирует все аргументы командной строки. Внешним исполняемым файлом может быть в том числе другой bat-файл.
Встроенные команды — это команды, которые являются частью интерпретатора командной строки. Полный список команд доступен по команде HELP. Данные команды не имеют отдельного исполняемого файла.
Иногда в имени файла или каталога встречаются пробелы. Наиболее очевидный пример — каталог Program Files на диске C. В этом случае помогают кавычки. Их можно расставить различными способами. Например:
cd "C:\Program Files\123" cd C:\”Program Files”\123
Операционная система Windows запрещает использование множества специальных символов в именах файлов, в том числе кавычки, поэтому проблем с указанием файлов не возникнет.
Комментарии
Оставлять комментарии при разработке — хороший тон. Так можно объяснить выполняемые действия и потенциальные ошибки. В пакетных файлах можно оставлять комментарии несколькими способами.
Официальный способ — команда rem или два двоеточия.
rem Это первый комментарий :: Это тоже комментарий
Перечисленные команды позволяют оставлять однострочные комментарии. Если хочется оставить развернутый многострочный комментарий, то прибегают к хитрости с командной GOTO.
goto start === Здесь можно оставить большой комментарий, лицензию или даже ASCII-арт === :start
В конце комментария задаем имя метки, а в начале комментария выполняем команду GOTO c именем метки. Этот способ требует внимания, так как для каждого комментария должна быть своя метка, иначе выполнение bat-файла может отличаться от ожидания разработчика.
Совместимость с MS-DOS
В старых ОС, таких как MS-DOS, было ограничение на отображение имени файлов. На экран выводилось восемь символов имени, точка и три символа расширения. Если имя файла превышало по длине восемь символов, то имя файла отображалось по следующей схеме:
Например, каталог Program Files выглядит следующим образом:
Progra~1
В современных операционных системах такое отображение не применяется, но CMD.EXE до сих пор поддерживает такие запросы к файлам и каталогам.
Используйте bat-файлы в работе с выделенным сервером
Выберите подходящий из более 100 готовых конфигураций.
Примеры bat-файлов
Рассмотрим несколько примеров bat-файлов. Начнем с базовых команд.
Обновление IP-адреса
Представим простой пример: необходимо обновить аренду IP-адресов на всех сетевых интерфейсах. В командной строке это делается одной командой:
ipconfig /renew
Данная команда генерирует много текстового вывода, который может испугать неподготовленного пользователя. Сама команда также может быть непривлекательной. Поэтому отключим отображение команды и перенаправим вывод выполнения в «никуда». Вместо слова NUL может быть любое имя или путь. Тогда вывод будет перенаправлен в указанный файл.
rem Отключаем отображение команд. Символ @ отключает отображение текущей команды @echo off rem Переводим вывод выполнения в устройство NUL, вывод исчезнет ipconfig /renew > NUL
При запуске такого скрипта появляется черное окно, которое быстро исчезает. Можно оставить простые и понятные пользователю сообщения и не дать окну закрыться.
@echo off echo Выполняется настройка, пожалуйста, подождите. ipconfig /renew > NUL echo Все хорошо. rem Эта команда остановит выполнение до тех пор, пока пользователь не нажмет любую клавишу pause
Скорее всего данный скрипт выведет набор непонятных символов вместо сообщения. Дело в том, что в русскоязычных ОС Windows по умолчанию в CMD.EXE используется кодировка CP866. Блокнот сохраняет в CP1251 (Windows-1251), а Notepad++ — в UTF-8. Для решения проблемы необходимо сменить кодировку интерпретатора командой chcp или сохранить bat-файл в кодировке интерпретатора.
rem Смена кодировки на Windows-1251 chcp 1251 > NUL rem Смена кодировки на UTF-8 chcp 65001 > NUL
Я сохранил файл в кодировке UTF-8 и итоговый скрипт получился таким:
@echo off chcp 65001 > NUL echo Выполняется настройка, пожалуйста, подождите. ipconfig /renew > NUL echo Все хорошо. pause
Создание резервной копии каталога
Перейдем к более жизненной ситуации — создание резервной копии (backup) каталога. Предположим, что каждый архив должен иметь в названии дату создания копии. Создадим каталог, имя которого — текущая дата. Текущая дата хранится в переменной DATE. Для обращения к переменным название переменной помещается между знаками процента.
mkdir %DATE% cd %DATE%
Копирование файлов в текущий каталог производится командой COPY.
rem файлы 1.txt и 2.txt будут скопированы в текущую папку COPY C:\1.txt C:\2.txt . rem файл 3.txt будет сохранен в текущую папку как example.txt COPY C:\1.txt .\example.txt
Возможно, в резервную копию необходимо дополнить служебную информацию — например, список файлов в корне копии и имя компьютера.
rem Имя компьютера записывается в файл computer.txt hostname > computer.txt rem Список файлов в текущем каталоге записывается в files.txt dir . > files.txt
Обычно резервные копии хранят в zip- или rar-архивах. Из командной строки отлично управляется архиватор 7z.
cd .. 7z -tzip a backup.zip %DATE%
Переименование файлов
Переименование файлов в Windows производится командой RENAME. Однако эта команда имеет свои особенности.
Во-первых, переименование возможно только в рамках одного диска и одного каталога. Между каталогами одного диска допустимо перемещение, а между разными дисками — только копирование.
rename abc.txt cba.txt
Во-вторых, возможно переименование по маске. Допустим, есть список фотографий photo000.jpeg, photo001.jpeg и так далее. Нужно сменить префикс с photo на mobile.
rename photo* mobile*
Если в текущем каталоге есть другие файлы с префиксом photo, а переименовать надо только изображения с расширением jpeg, то команда модифицируется:
rename photo*.jpeg mobile*.jpeg
Удаление файлов
Программы и пользователи оставляют следы работы в виде файлов, которые не удаляются автоматически. К счастью, процесс очистки поддается автоматизации.
Предположим, что в процессе работы пользователя генерируется большое количество файлов с расширением jpeg, которые нужно удалять. На помощь приходит оператор цикла FOR.
rem Ищем все файлы с расширением jpeg в каталоге work rem Ключ /r включает в поиск все подкаталоги в каталоге work for /r work %%file in (*.jpeg) do ( rem Выводим имя файла echo %%file delete %%i )
Заключение
Командный интерпретатор CMD.EXE существует долгое время, но, даже несмотря на отсутствия развития, остается востребованным инструментом для автоматизации рутинных действий в операционной системе Microsoft Windows.