Пакетные файлы Windows:.bat vs .cmd?

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

Ответ 1

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

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

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

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

Ответ 2

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

  • 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 выполняет файлы для более подробной информации.

Литература:

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

Ответ 3

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

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

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

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

Ответ 4

Нет - это нисколько не важно. На 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 оболочки.

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

Выполнение файла

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

Ответ 11

Расширение не имеет значения.

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

Ответ 12

Слегка от темы, но вы считали Windows Scripting Host? Вам может показаться приятнее.

Ответ 13

Вот одно отличие, которое я обнаружил: EnableDelayedExpansion требуется в файлах .cmd.
Где, как в случае с файлами .bat, он по умолчанию неявно. (Windows 10)

dir *? | find /i "FOOBAR"
if ERRORLEVEL 0             (
set result="found"  ) else  (
set result="not found"  )
echo %result%

Это работает в .bat, но всегда found в случае файла .cmd.
Изменение line 2 на следующее заставляет его работать как ожидалось:

if %ERRORLEVEL% equ 0       (

И, наконец, для файла .cmd это работает правильно:

setLocal EnableDelayedExpansion
...
if !ErrorLevel! equ 1       (
...

Ответ 14

Будучи программистом Cmd и просматривая по всему Интернету, действительно не имеет значения, какой из них вы используете, вы можете иметь программу .bat на Windows 7 и запускать ее в Windows 10. но если вы должны сделать это на Windows 10, вы, вероятно, не сможете запускать все команды в Windows 7. A .cmd является точно таким же способом и запускает ту же самую программу и коды.

Все различие заключается в том, что это другое имя той же программы, если оно связано с CMD.EXE, оно выполняет те же команды.

Ответ 15

разность:

Файлы

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

вы можете столкнуться с этим, когда вы выполните файл script, а затем отредактируете его до его выполнения. файлы bat будут испорчены этим, но cmd файлы не будут.