Bat и cmd в чем отличие

от admin

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, который мы отображаем сразу после вызова и после встроенной команды

Вывод .bat файла: команда prompt оказалась "прозрачной" для %ERRORLEVEL%

Вывод .cmd файла: здесь очевидно, что команда вернула свой код ошбки (ноль) и затерла код ошибки предыдущей команды

Различия незначительные, но могут попортить нервов на поиски решения проблемы в случае скрипта, аналогичном примеру. Этот пример лишний раз говорит в пользу первичной инициализации состояния и переменных.

Посмотрел описание команд — туманно и рекурсивно (сепульки и сепулькарии), а про код ошибки — ни слова.

Пакетные файлы Windows: .bat против .cmd?

Как я понимаю, .bat — это старое 16-битное соглашение об именах, а .cmd — для 32-разрядной Windows, то есть, начиная с NT. Но я по-прежнему вижу файлы .bat везде, и они, похоже, работают точно так же, используя любой суффикс. Предполагая, что моему коду никогда не понадобится работать на чем-то старше NT, действительно ли имеет значение, как я называю свои командные файлы, или есть ли gotcha, ожидающие меня, используя неправильный суффикс?

15 ответов

Различия между .CMD и .BAT в том, что касается CMD.EXE, заключаются в следующем: при включенных расширениях PATH/APPEND/PROMPT/SET/ASSOC в файлах .CMD устанавливает ERRORLEVEL независимо от ошибки. .BAT устанавливает ERRORLEVEL только для ошибок.

Другими словами, если для ERRORLEVEL установлено значение, отличное от 0, а затем вы запустите одну из этих команд, в результате ERRORLEVEL будет:

  • оставить в покое с его ненулевым значением в файле .bat
  • сбросить до 0 в файле .cmd.

Вот компиляция проверенной информации из различных ответов и цитируемых ссылок в этом потоке:

  • command.com — это 16-разрядный командный процессор, представленный в MS-DOS и также используемый в операционных системах серии Win9x.
  • cmd.exe — 32-разрядный командный процессор в Windows NT (64-разрядные ОС Windows также имеют 64-разрядную версию). cmd.exe никогда не был частью Windows 9x. Он возник в OS/2 версии 1.0, а версия OS/2 cmd начала 16-разрядную (но была, тем не менее, полноценной защищенной программой с такими командами, как start ). Windows NT унаследовала cmd от OS/2, но версия Windows NT Win32 началась с 32-разрядной версии. Хотя OS/2 пошла на 32-разрядную версию в 1992 году, ее cmd оставалась 16-разрядной программой OS/2 1.x.
  • Переменная ComSpec env определяет, какая программа запускается скриптами .bat и .cmd . (Начиная с WinNT это значение по умолчанию равно cmd.exe .)
  • cmd.exe обратно совместим с command.com .
  • A script, который предназначен для cmd.exe , может быть назван .cmd , чтобы предотвратить случайное выполнение в Windows 9x. Это расширение имени файла также относится к OS/2 версии 1.0 и 1987.

Вот список функций cmd.exe , которые не поддерживаются command.com :

  • Длинные имена файлов (превышающие формат 8.3)
  • История команд
  • Завершение вкладки
  • Символ возврата: ^ (Используйте для: \ & | > < ^ )
  • Стек каталога: PUSHD / POPD
  • Целочисленная арифметика: SET /A i+=1
  • Поиск/Замена/Подстрока: SET %varname:expression%
  • Подстановка команд: FOR /F (существовала до, была улучшена)
  • Функции: CALL :label

Если обе версии .bat и .cmd script (test.bat, test.cmd) находятся в одной папке, и вы запускаете script без расширения (теста), по умолчанию версия .bat из script будет работать даже в 64-битной Windows 7. Порядок выполнения контролируется переменной среды PATHEXT. См. Заказ, в котором Command Prompt выполняет файлы для более подробной информации.

  • cmd.exe
  • command.com

Эти ответы слишком длинные и ориентированы на интерактивное использование. Важные отличия для сценариев:

  • .cmd предотвращает непреднамеренное выполнение в системах, отличных от NT.
  • .cmd позволяет встроенным командам изменить уровень ошибки на 0 в случае успеха.

Расширения команд по умолчанию включены в файлах .bat и .cmd в Windows 2000 или более поздней версии.

В 2012 году и далее я рекомендую использовать исключительно .cmd .

Нет — это нисколько не важно. На NT расширение .bat и .cmd заставляет процессор cmd.exe обрабатывать файл точно так же.

Дополнительная интересная информация о command.com vs. cmd.exe в системах класса WinNT от MS TechNet (http://technet.microsoft.com/en-us/library/cc723564.aspx):

Это поведение показывает довольно тонкий особенность Windows NT, которая очень важный. 16-разрядная оболочка MS-DOS (COMMAND.COM), который поставляется с Windows NT специально разработан для Windows NT. Когда команда вводится для выполнение этой оболочкой, это не фактически выполнить его. Вместо этого упаковывает текст команды и отправляет ее для 32-разрядной командной оболочки CMD.EXE для выполнение. Поскольку все команды фактически выполненный CMD.EXE( Командная оболочка Windows NT), 16-разрядный shell наследует все функции и средства всей Windows NT оболочки.

RE: Очевидно, когда вызывается command.com, это немного сложная тайна;

Несколько месяцев назад, в ходе проекта, нам пришлось выяснить, почему некоторые программы, которые мы хотели запустить под CMD.EXE, на самом деле работали под командой COMMAND.COM. «Программа», о которой идет речь, была очень старым .BAT файлом, который по-прежнему работает ежедневно.

Мы обнаружили, что причина, по которой командный файл работает под COMMAND.COM, заключается в том, что он запускается из файла .PIF(также древнего). Поскольку настройки конфигурации специальной памяти, доступные только через PIF, стали неактуальными, мы заменили его обычным ярлыком на рабочем столе.

Тот же командный файл, запущенный из ярлыка, запускается в CMD.EXE. Когда вы думаете об этом, это имеет смысл. Причина, по которой нам так долго нужно было это понять, была частично связана с тем, что мы забыли, что ее элемент в группе запуска был PIF, поскольку он был в производстве с 1998 года.

Читать:
Сколько значащих цифр содержит двоичная запись десятичного числа 16

Поскольку исходное сообщение касалось последствий использования суффикса .bat или .cmd, необязательно команды внутри файла.

Еще одно отличие между .bat и .cmd заключается в том, что если два файла существуют с тем же именем файла и обоими этими расширениями, то:

ввод имени файла или filename.bat в командной строке будет запущен .bat файл

чтобы запустить файл .cmd, вам нужно ввести filename.cmd

Тем не менее, в Windows 7 BAT файлы также имеют такую ​​разницу: если вы когда-либо создавали файлы TEST.BAT и TEST.CMD в том же каталоге и запускали TEST в этом каталоге, он запускал бы BAT файл.

все, работающие в партии, должны работать в cmd; cmd предоставляет некоторые расширения для управления средой. Кроме того, cmd выполняется в новом интерпретаторе cmd и, следовательно, должен быть быстрее (не заметно на коротких файлах) и более стабильным, поскольку bat работает под эмулируемой 16-битной средой с поддержкой NTVDM

Windows batch files: .bat vs .cmd?

As I understand it, .bat is the old 16-bit naming convention, and .cmd is for 32-bit Windows, i.e., starting with NT. But I continue to see .bat files everywhere, and they seem to work exactly the same using either suffix. Assuming that my code will never need to run on anything older than NT, does it really matter which way I name my batch files, or is there some gotcha awaiting me by using the wrong suffix?

Ross Ridge's user avatar

12 Answers 12

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.

In other words, if ERRORLEVEL is set to non-0 and then you run one of those commands, the resulting ERRORLEVEL will be:

  • left alone at its non-0 value in a .bat file
  • reset to 0 in a .cmd file.

Jean-François Corbett's user avatar

Ben Hoffstein's user avatar

Here is a compilation of verified information from the various answers and cited references in this thread:

  1. command.com is the 16-bit command processor introduced in MS-DOS and was also used in the Win9x series of operating systems.
  2. cmd.exe is the 32-bit command processor in Windows NT (64-bit Windows OSes also have a 64-bit version). cmd.exe was never part of Windows 9x. It originated in OS/2 version 1.0, and the OS/2 version of cmd began 16-bit (but was nonetheless a fully fledged protected mode program with commands like start ). Windows NT inherited cmd from OS/2, but Windows NT’s Win32 version started off 32-bit. Although OS/2 went 32-bit in 1992, its cmd remained a 16-bit OS/2 1.x program.
  3. The ComSpec env variable defines which program is launched by .bat and .cmd scripts. (Starting with WinNT this defaults to cmd.exe .)
  4. cmd.exe is backward compatible with command.com .
  5. A script that is designed for cmd.exe can be named .cmd to prevent accidental execution on Windows 9x. This filename extension also dates back to OS/2 version 1.0 and 1987.

Here is a list of cmd.exe features that are not supported by command.com :

  • Long filenames (exceeding the 8.3 format)
  • Command history
  • Tab completion
  • Escape character: ^ (Use for: \ & | > < ^ )
  • Directory stack: PUSHD / POPD
  • Integer arithmetic: SET /A i+=1
  • Search/Replace/Substring: SET %varname:expression%
  • Command substitution: FOR /F (existed before, has been enhanced)
  • Functions: CALL :label

Order of Execution:

If both .bat and .cmd versions of a script (test.bat, test.cmd) are in the same folder and you run the script without the extension (test), by default the .bat version of the script will run, even on 64-bit Windows 7. The order of execution is controlled by the PATHEXT environment variable. See Order in which Command Prompt executes files for more details.

These answers are a bit too long and focused on interactive use. The important differences for scripting are:

  • .cmd prevents inadvertent execution on non-NT systems.
  • .cmd enables built-in commands to change Errorlevel to 0 on success.

Not that exciting, eh?

There used to be a number of additional features enabled in .cmd files, called Command Extensions. However, they are now enabled by default for both .bat and .cmd files under Windows 2000 and later.

Bottom line: in 2012 and beyond, I recommend using .cmd exclusively.

What's the difference between .cmd and .bat files?

Just curious. «Cool» people in our company always use *.cmd while no one was able to explain the difference to me.

5 Answers 5

There are semantic differences in the command language used for each ( .bat files get a compatibility version). Some of these can be illustrated by this script from over here:

Basically, .cmd files get the current, sexier version of the MS command language, which is why the cool kids use them.

chaos's user avatar

According to Wikipedia:

.bat: The first extension used by Microsoft for batch files. This extension can be run in most Microsoft Operating Systems, including MS-DOS and most versions of Microsoft Windows.

.cmd: The newer .cmd extension is described by Windows NT based systems as a ‘Windows NT Command Script’ and is helpful, as using a .cmd extension rather than .bat extension means that earlier versions of Windows won’t know how to run it, so that they don’t try to and mistake the commands for COMMAND.COM style files and fail to run the new style commands due to the lack of command extensions, resulting in scripts only being partially run which could prove damaging (for example; failing to check the successful copying of a file and then deleting the original anyway).

The only known difference between .cmd and .bat file processing is that in a .cmd file the ERRORLEVEL variable changes even on a successful command that is affected by Command Extensions (when Command Extensions are enabled), whereas in .bat files the ERRORLEVEL variable changes only upon errors.

Похожие статьи