Пакетные файлы Windows: .bat против .cmd? - PullRequest
684 голосов
/ 29 сентября 2008

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

Ответы [ 14 ]

412 голосов
/ 29 сентября 2008

С эта новостная группа Марк Збиковски Сам:

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

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

  • оставлено в покое с ненулевым значением в файле .bat
  • Сброс до 0 в файле .cmd.
389 голосов
/ 29 сентября 2008

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

  1. command.com - это 16-разрядный командный процессор, представленный в MS-DOS, который также использовался в операционных системах серии Win9x.
  2. 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, но версия Win32 для Windows NT начала работать с 32-разрядной версией. Хотя OS / 2 стала 32-битной в 1992 году, ее cmd оставалась 16-битной программой OS / 2 1.x.
  3. Переменная ComSpec env определяет, какая программа запускается сценариями .bat и .cmd. (Начиная с WinNT, по умолчанию это cmd.exe.)
  4. cmd.exe обратно совместим с command.com.
  5. Сценарий, разработанный для cmd.exe, может иметь имя .cmd для предотвращения случайного выполнения в Windows 9x. Это расширение имени файла также относится к OS / 2 версии 1.0 и 1987.

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

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

Порядок исполнения:

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

Ссылки:

Википедия: Сравнение командных оболочек

60 голосов
/ 17 августа 2012

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

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

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

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

24 голосов
/ 29 сентября 2008

Нет - это не имеет значения ни в малейшей степени. В NT расширение .bat и .cmd приводят к тому, что процессор cmd.exe обрабатывает файл одинаково.

Дополнительная интересная информация о command.com и 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-разрядная оболочка наследует все функции и средства полной Windows NT оболочки.

15 голосов
/ 08 июля 2012

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

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

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

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

13 голосов
/ 05 февраля 2014

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

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

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

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

12 голосов
/ 22 ноября 2014

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

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

C:\Temp>echo echo bat > test.bat

C:\Temp>echo echo cmd > test.cmd

C:\Temp>test

C:\Temp>echo bat
bat

C:\Temp>
8 голосов
/ 29 сентября 2008

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

3 голосов
/ 18 октября 2015

.cmd и .bat файл выполняются по-разному, потому что в переменной .cmd errorlevel он может меняться в команде, на которую влияют расширения команд. Вот и все.

3 голосов
/ 02 октября 2008

Немного не по теме, но рассматривали ли вы Windows Scripting Host ? Вы можете найти это лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...