Пакетные файлы Windows:.bat против .cmd?
-
02-07-2019 - |
Вопрос
Насколько я понимаю, это, .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.
Другие советы
Вот подборка проверенной информации из различных ответов и приведенных ссылок в этой теме:
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 NTcmd
из OS / 2, но версия Win32 для Windows NT начиналась как 32-разрядная.Хотя OS / 2 стала 32-разрядной в 1992 году, ееcmd
оставалась 16-разрядной программой OS/2 1.x.- Тот Самый
ComSpec
переменная env определяет, какая программа запускается.bat
и.cmd
Скрипты.(Начиная с WinNT, по умолчанию используется значениеcmd.exe
.) cmd.exe
обратно совместим сcommand.com
.- Скрипт, предназначенный для
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-файлы - нет.