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

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

15 ответов


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

различия между .CMD и .Летучая мышь, насколько CMD.EXE обеспокоен являются: с включенными расширениями, путь / добавление/приглашение/набор / ASSOC .УМК файлы будут устанавливать ERRORLEVEL независимо от ошибки. .BAT устанавливает уровень ошибок только по ошибкам.


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

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

порядок выполнения:

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

ссылки:

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


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

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

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

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


нет - это не имеет ни малейшего значения. На НТ .летучая мышь и. расширение cmd вызывает cmd.exe процессор для обработки файла точно так же.

дополнительную интересную информацию о command.com и УМК.exe на системах класса WinNT от MS TechNet (http://technet.microsoft.com/en-us/library/cc723564.aspx):

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


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

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

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

тот же пакетный файл, запущенный из ярлыка, запускается в CMD.ИСПОЛНЯЕМЫЙ. Когда вы думаете об этом, это имеет смысл. Причина, по которой нам потребовалось так много времени, чтобы понять это, была частично из-за того, что мы забыли, что его пункт в startup group был PIF, потому что он был в производстве с 1998 года.


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

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

  • задание имя файла или имя файла.BAT в командной строке будет работать .летучая мышь файл

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


тем не менее, в Windows 7 файлы BAT также имеют эту разницу : если вы когда-либо создавали тест файлов.Летучая мышь и тест.CMD в том же каталоге, и вы запускаете тест в этом каталоге, он будет запускать файл 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>

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


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


немного не по теме, но вы рассмотрели Windows Scripting Host? Возможно, тебе будет приятнее.


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


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


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

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

это работает в .bat но всегда found в случае .
Меняется line 2 к следующему делает его работать как ожидалось:

if %ERRORLEVEL% equ 0       (

и наконец это работает правильно:

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

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

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


разница:

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

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