Вопрос

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

Это было полезно?

Решение

От публикация в этой новостной группе Автор: Марк Збиковский сам по себе:

Различия между .CMD и .BAT, насколько это касается CMD.EXE , заключаются в следующем:Если расширения включены, PATH/APPEND/PROMPT/SET/ASSOC в .CMD для файлов будет установлен УРОВЕНЬ ОШИБКИ независимо от наличия ошибки..BAT устанавливает УРОВЕНЬ ошибки только для ошибок.

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

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

Другие советы

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

  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)
  • История команд
  • Завершение вкладки
  • Экранирующий символ: ^ (Использовать для: \ & | > < ^)
  • Стек каталогов: 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.Видишь Порядок, в котором Командная строка выполняет файлы для получения более подробной информации.

Ссылки:

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

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

  • .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 НТ разработана специально для Windows НТ.Когда команда вводится для выполнения этой оболочкой, она фактически не выполняет ее.Вместо этого он упаковывает текст команды и отправляет его в 32-разрядную CMD.EXE командную оболочку для выполнения.Поскольку все команды фактически выполняются CMD.EXE (командной оболочкой Windows NT), 16-разрядная оболочка наследует все функции и возможности полной оболочки Windows NT .

РЕ: По-видимому, когда вызывается command.com, это немного сложная загадка;

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

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

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

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

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

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

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

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

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

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

Немного не по теме, но вы подумали об этом Узел сценариев Windows?Возможно, вам это покажется приятнее.

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

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

Вот одно отличие, которое я обнаружил: EnableDelayedExpansion является требуемый в .cmd Файлы.
Где, как в случае .bat files по умолчанию это неявно.(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       (
...

разница:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top