it-swarm.com.ru

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

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

686
Chris Noe

От это сообщение группы новостей от Марк Збиковский сам:

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

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

  • оставить в покое, отличном от 0 в файле .bat
  • сбросить до 0 в файле .cmd.
413
Ben Hoffstein

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

  1. command.com - это 16-битный командный процессор, представленный в MS-DOS, который также использовался в операционных системах серии Win9x.
  2. cmd.exe - это 32-разрядный командный процессор в Windows NT (64-разрядные ОС Windows также имеют 64-разрядную версию). cmd.exe никогда не был частью Windows 9x. Он возник в OS/2 версии 1.0, а версия cmd для OS/2 стала 16-разрядной (но, тем не менее, была полноценной программой защищенного режима с такими командами, как start). Windows NT унаследовала cmd от OS/2, но версия Windows NT для Win32 начала работать с 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. Смотрите Порядок, в котором командная строка выполняет файлы для более подробной информации.

Рекомендации:

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

390
Chris Noe

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

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

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

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

61
Gringo Suave

Нет - это не имеет значения ни в малейшей степени. В 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.

24
Michael Burr

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

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

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

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

15
David Gray

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

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

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

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

13
Rob at TVSeries.com

Тем не менее, в 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>
13
tvCa

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

8
Lorenzo Boccaccia

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

3
Marcin

Я считаю, что если вы измените значение переменной среды ComSpec на% SystemRoot% system32\cmd.exe, тогда не имеет значения, является ли расширение файла .BAT или .CMD. Я не уверен, но это может быть даже по умолчанию для WinXP и выше.

3
Patrick Cuff

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

3
zask

Расширение не имеет значения. Есть небольшие различия между COMMAND.COM, обрабатывающим файл, и CMD.EXE

2
Waldo