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

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

29.09.2008 14:39:07
Просто чтобы добавить к путанице, теперь у нас также есть файлы .ps1.
Martin Brown 4.03.2015 10:32:53
если я не ошибаюсь .ps1 файлы должны быть Windows Power Shell. Хотя я могу ошибаться.
CMS_95 2.06.2015 15:31:28
13 ОТВЕТОВ
РЕШЕНИЕ

Из этой группы новостей проводки по Mark Zbikowski сам:

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

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

  • оставить в покое, отличном от 0 в файле .bat
  • сбросить до 0 в файле .cmd.
449
24.10.2018 08:52:34
Означает ли это, что использование сценария .bat не вернет значение ERRORLEVEL 0 в случае успеха? Если это правда, я никогда этого не замечал.
djangofan 1.07.2013 16:22:13
Я думаю, это означает, что если ERRORLEVEL был установлен не в 0, то вы запустите одну из этих команд, она останется одна (не 0) в файле .bat, но сбросится в 0 в файле .cmd. Но, поскольку Windows является тем, чем она является, вполне возможно, что на самом деле беззвучный голос говорит вам, в Pig Latin, «сбросьте ERRORLEVEL самостоятельно, если вам так важно!».
MadScientist 10.07.2013 15:37:55
Я думаю, это говорит о том, что только эти конкретные команды будут выполнять различные действия set / not set. Другие будут работать как обычно
PsychoData 4.02.2014 22:41:21
Теперь я понимаю. Я обновил мою суть. Очевидно, он не (повторно) устанавливает уровень ошибки при вызове set var=..оператора. Что странно, потому что я предположил, что это было ожидаемое поведение. Аргументы могут быть сделаны для обоих. Я буду придерживаться .bat файлов. :-)
wasatchwizard 18.08.2015 13:40:07
Я понятия не имел, что есть поведенческая разница; Я подумал, что единственное отличие состоит в том, что вероятность того, что .cmdфайл будет загружен, будет command.comменьше cmd.exe, чем , поскольку, предположительно, DOS не ищет их (по умолчанию), а Windows 9x не имеет связи с ними. Главная причина в том, что вы могли бы оправдать пропуск любого "это cmd.exe?" проверяет .cmd, но не в .bat. (32-битная Windows все еще поставляется с совместимостью с DOS, верно?)
SamB 20.05.2017 18:29:04

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

  1. command.com 16-разрядный командный процессор, представленный в MS-DOS и использовавшийся в операционных системах серии Win9x.
  2. cmd.exe32-разрядный командный процессор в 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. См. Порядок, в котором командная строка выполняет файлы для получения дополнительной информации.

Ссылки:

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

413
23.05.2017 12:18:22
Несколько незначительных моментов: 1) .bat не обязательно вызывает command.com - очевидно, когда вызывается command.com, это немного сложная загадка; 2) command.com был представлен с MS-DOS; 3) cmd.exe может запускать большинство сценариев command.com, но есть несколько незначительных вещей command.com, которые не работают в cmd.
Michael Burr 29.09.2008 23:01:39
cmd.exe был представлен с NT 4.0, я полагаю, не с Windows 95.
FlySwat 1.10.2008 01:53:58
Крис: см. Текущую версию статьи в Википедии, особенно комментарий Марка Збиковского на groups.google.com/group/…
Mark 4.05.2009 09:01:43
Просто добавить некоторую информацию по этому вопросу: так dir filenameже, как dir filename.*в command.com; подстановочный знак требуется в cmd.exe. В command.com rem Create an empty file > empty.txtработает; не в cmd.exe.
Aacini 24.05.2015 17:39:01
Похоже, лишь малая часть этого относится к вопросу OP, касающемуся разницы между .bat и .cmd, а не разницы между command.com и cmd.exe. Когда я это читаю, вопрос касается разницы между файлом .bat и файлом .cmd, при прочих равных условиях.
Stewart 7.11.2018 14:45:30

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

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

Не так интересно, а?

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

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

81
9.01.2020 02:49:24
ИМО, это главное. Вы используете .cmd в качестве расширения для новых сценариев, когда хотите убедиться, что они не выполняются в старых 16-разрядных ОС, или если вы не уверены, что они будут работать.
Oliver 24.02.2014 14:04:15
Я действительно ценю краткие, прагматичные и ясные ответы за тоннами стен бесполезных, похожих на университетский класс ответов.
Liquid Core 16.10.2018 07:19:51
Я профессор университета, и я согласен с @Liquid Core! Краткие, прагматичные, четкие ответы - это то, как мы учимся (когда мы еще ничего не знаем). Затем, так или иначе, как только мы понимаем это, мы чувствуем потребность объяснить это абстрактно и непостижимо. Weird. Хорошее наблюдение!
Eureka 6.05.2019 10:26:50

Нет - это не имеет значения ни в малейшей степени. В 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
29.09.2008 23:34:10
Это может иметь значение; как упоминается в тексте вашей ссылки, различия незначительны.
Gringo Suave 20.02.2013 03:11:13
Вы можете заставить command.com выполнить команду dos, указав ее в командной строке. См command /c verпротив запуска command.com и ввода вер.
phd443322 18.06.2014 12:45:10
Название имеет значение: D Видел много .bat от парней из прошлого! Используйте .cmd! Также не могу поверить, что NT все еще используется сегодня ...
hfrmobile 16.04.2015 09:12:14
@hfrmobile: когда я упомянул «NT», я имел в виду, в основном, все версии Windows, основанные на NT (а не 9x). Так что, по сути, NT, Win2k и все версии Windows для рабочего стола или сервера начиная с XP. И имя файла может дать представление о мышлении и стиле кодирования человека, который написал файл, но для интерпретатора нет никакой разницы.
Michael Burr 16.04.2015 17:45:21

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

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

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

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

16
7.07.2012 22:47:44
Что это была за ОС? Что-то до XP?
phk 15.10.2016 16:17:34

Тем не менее, в 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>
14
22.11.2014 17:04:09
Это происходит потому, что test.bat находится в алфавитном порядке перед test.cmd. Windows делает жадное завершение.
David 3.04.2015 18:55:42
@ Дэвид: не правда. Это происходит потому, что в PATHEXTпеременной расширение .BAT размещается перед .CMD (как показано в этом ответе). Если вы измените этот порядок в PATHEXT, вместо этого будет выполнен test.cmd.
Aacini 24.05.2015 17:12:11
Хм, я надеялся, что они были в другом порядке; Я предполагаю, что MS, должно быть, обнаружила (или предположила), что некоторые существующие программы поставляли файлы .CMD и файлы .BAT с одним и тем же базовым именем, где файлы .CMD, конечно, не предназначались в качестве входных данных для (еще не отправленного) cmd. exe, но могло быть и множество других вещей: например, команды для какой-либо другой оболочки, сценарий конфигурации, читаемый приложением, или некоторый двоичный файл приложения. (По крайней мере, это мое понимание обычного способа, которым MS в конечном итоге
SamB 20.05.2017 19:01:11
Стоит также отметить, что текущий каталог находится перед другими каталогами в PATHпеременной среды независимо от расширения.
Turkeyphant 10.06.2019 22:59:23

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

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

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

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

13
5.02.2014 14:46:29
А? Если я помещаю cmd-файл в мой каталог, мне не нужно указывать расширение файла, чтобы вызвать его. Пример: echo notepad.exe% *> np.cmd Тогда, если я просто наберу "np mytextfilename.txt", он вызовет блокнот. Мне не нужно вводить «np.cmd», чтобы вызвать его.
Jon Davis 3.04.2015 20:36:04
@ stimpy77: Это верно, если np.cmd является единственным файлом с таким именем, но «если существуют два файла с одинаковым именем файла и обоими этими расширениями» , то единственный способ выполнить .cmd - это включить его расширение. ..
Aacini 24.05.2015 17:22:35
Это необходимость устранения неоднозначности для любой оболочки, не имеющая ничего общего с техническими различиями между .cmd и .bat. Вероятно, это связано с тем, что filename.bat в алфавитном порядке предшествует filename.cmd.
Jon Davis 25.05.2015 21:22:04
Это на самом деле зависит от PATHEXTпеременной среды. Порядок, в котором появляются расширения, есть порядок приоритета, если расширение не указано. Стоит также упомянуть, что нет необходимости указывать расширение для файлов, которые появляются в переменной env.
Ricardo Zorio 25.09.2015 19:50:43

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

8
29.09.2008 14:47:51
Не должно иметь никакого значения в скорости. .batне работает под DOS в NT. VDM запускается, только если программа нуждается в этом, и даже не поддерживается в 64-битной Windows, хотя я считаю, что .bat есть.
Gringo Suave 20.02.2013 03:17:05

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

3
15.08.2017 18:56:49
Грубый ^. ^ Существуют различия в языке команд, используемых для каждого (.bat файлы получают версию совместимости). Некоторые из них могут быть проиллюстрированы этим сценарием отсюда: @echo off&setlocal ENABLEEXTENSIONS call :func&&echo/I'm a cmd||echo/I'm a bat goto :EOF :func md;2>nul set var=1
zask 25.01.2016 17:28:30
В файлах .cmd каждая команда устанавливает уровень ошибки, в файлах .bat некоторые команды оставляют уровень ошибки без изменений, как описано в принятом ответе
jeb 25.01.2016 17:46:39
BAT был создан для взаимодействия с COMMAND.COM, командным интерпретатором DOS. Microsoft приняла большинство команд DOS в своем новом интерпретаторе CMD. EXE. CMD был создан для взаимодействия с CMD.EXE и нарушает совместимость с COMMAND.COM. в основном известен тем, как они обрабатывают переменную errorlevel. При использовании BAT эта переменная изменяется только тогда, когда возникает фактическая ошибка и не происходит никаких изменений в состоянии, когда каждая команда выполняется успешно. Это не верно для CMD, поскольку переменная errorlevel по-прежнему будет изменять состояние, даже если ошибок не будет.
zask 26.01.2016 03:53:16

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

3
26.08.2019 15:59:36

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

1
8.10.2009 21:52:40
В этом отношении PowerShell, который не поддерживает WSH / cscript.exe.
Jon Davis 3.07.2010 20:40:10
@ stimpy77 Правда, хотя powershell мне кажется довольно ужасным.
Marcin 16.09.2012 18:39:50
Я нахожу WSH намного хуже. Полагаю, все зависит от того, что мы измеряем «ужасным». PowerShell имеет ужасное время запуска. Все об этом абсолютно замечательное ИМО.
Jon Davis 18.09.2012 22:55:00
Извините за форматирование, но чтобы ускорить время запуска PSH, попробуйте запустить: Set-Alias ​​ngen @ (dir (путь соединения $ {env: \ windir} "Microsoft.NET \ Framework") ngen.exe -recurse | sort -descending lastwritetime) [0] .fullName [НОВАЯ ЛИНИЯ ЗДЕСЬ] [appdomain] :: currentdomain.getassemblies () | % {ngen $ _. location}
mjbnz 25.03.2013 20:51:09
Совершенно не по теме.
HappyDog 11.07.2019 09:19:30

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

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

1
26.08.2019 14:45:33

разница:

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

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

-10
3.04.2010 20:22:22
Как уже было установлено, переменная ComSpec env определяет, какая программа запускается. По сути, вы говорите, что command.com читает файл по очереди, а cmd.exe предварительно загружает файл в память? Можете ли вы привести ссылку на это?
Chris Noe 5.04.2010 21:27:38
Это неправильно для Vista и XP, оба типа файлов читаются построчно. Если вы приостановите файл .cmd или .bat и отредактируете его, будет выполнен новый код
jeb 6.11.2010 00:01:17
Можно было бы обсудить, построчно ли это, потому что, если вы приостановите выполнение в середине командного файла и добавите символ в начале, после возобновления анализатор будет отключен одним символом, возможно, отбрасывая остальную часть вашего сценария.
user315772 3.03.2012 03:06:18
Вы не должны спорить .bat и .cmd не отличаются таким образом. Оба всегда читаются построчно. Вы можете проверить это, если не верите. Создайте командный файл, который echo 1&pauseзатем выполняет его. Вы увидите 1и Press any key to continue.... Пока пауза добавить новую строку echo 2&pauseс внешним редактором. Нажмите кнопку. Вы увидите 2и Press any key to continue.... Вы даже можете попробовать добавить echo 3&pauseв начале. Когда вы нажмете клавишу после этого снова, вы увидите 2.
venimus 14.06.2012 08:29:34