2008-09-29 1 views
598

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

ответ

357

От Wikipedia:

Новая Цитата из Википедии

Единственное известное различие между CMD-исполнением и .bat файлом является то, что в .CMD файл переменных изменений Errorlevel даже по успешной команде , на которую влияют расширенные команды (когда включены расширения команд), , тогда как в .bat-файлах ERRORLEVEL переменная изменяется только при ошибках.

Источник цитирования Wikipedia, приведенный выше, фактически основан на this news group posting.

Различия между .CMD и .BAT насколько CMD.EXE обеспокоен являются: С расширениями включен, PATH/APPEND/ПОДСКАЖИТЕ/SET/ASSOC в .CMD файлы будут устанавливать ERRORLEVEL независимо от ошибки. .BAT устанавливает ERRORLEVEL только при ошибках.

Это не только немного более ограничительными в отношении различий, чем текст Википедии, но также стоит быть явно упомянуто, учитывая тот факт, что был вывешен Mark Zbikowski себя - что дает огромный бонус доверия ИМХО.

25

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

2

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

8

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

3

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

354

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

  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, но Windows-версия Win32 от версии 32 началась. Хотя OS/2 пошла на 32-разрядную версию в 1992 году, ее cmd остался 16-разрядной OS/2 1.x программой.
  3. Env переменная ComSpec определяет, какая программа запускается с помощью .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
  • Integer арифметика: SET /A i+=1
  • Поиск/Заменить/Substring: SET %varname:expression%
  • подстановки команд: FOR /F (существовали и раньше, была повышена)
  • Функции: CALL :label

Порядок исполнения:

Если обе версии .bat и .cmd скрипта (test.bat, test.cmd) находятся в одной папке, и вы запускаете скрипт без расширения (теста), по умолчанию будет запущена версия .bat скрипта, даже в 64-разрядная версия Windows 7.Порядок выполнения контролируется переменной среды PATHEXT. См. Order in which Command Prompt executes files для более подробной информации.

Ссылки:

википедии: Comparison of command shells

+2

Несколько второстепенных баллов: 1) .bat не обязательно вызывает command.com - очевидно, когда вызывается command.com, это немного сложная тайна; 2) command.com был введен с MS-DOS; 3) cmd.exe может запускать большинство скриптов command.com, но есть несколько незначительных вещей command.com, которые не работают в cmd. – 2008-09-29 23:01:39

+0

Эй, Майк, если у вас есть какие-либо особенности в функциях command.com, которые не работают на cmd.exe, я думаю, было бы целесообразно опубликовать отдельный ответ на это. – 2008-09-30 00:02:50

+0

Это было так давно, что я работал над Win9x или DOS, единственное, что я помню, это то, что вы могли бы сделать что-то вроде «cd ...», чтобы перейти на более чем один уровень каталога (эй, я сказал, минор, не я ?). Однако см. Мой отредактированный ответ для получения информации о обработке command.com на NT. – 2008-09-30 05:00:02

3

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

+11

В этом случае PowerShell, который обесценивает WSH/cscript.exe. – 2010-07-03 20:40:10

-10

разница:

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

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

+0

Как было установлено, переменная env ComSpec определяет, какая программа запущена, вы, по сути, говорите, что command.com читает файл по строке за раз, а cmd.exe предварительно загружает файл в память? Можете ли вы привести ссылку на это? – 2010-04-05 21:27:38

+23

Это неправильно для Vista и XP, оба типа файлов читаются по строкам. Если вы приостановите файл .cmd или .bat и отредактируете его, будет выполнен новый код. – jeb 2010-11-06 00:01:17

+3

Возможно, вы думаете о файлах `.btm` (« пакет в память »), используемых в интерпретаторах интерпретатора JP Software] (http : //jpsoft.com./help/batchtype.htm). – JdeBP 2012-01-02 12:13:21

15

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

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

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

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

38

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

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

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

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

13

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

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

  • входящего имя_файла или имя файла .bat в командной строке будет работать .bat файл

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

9

Тем не менее, на Windows 7, BAT-файлы имеют также Тхи s: Если вы когда-либо создавали файлы 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> 
2

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

-2

Вот одна разница, которую я обнаружил: EnableDelayedExpansion is в .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  (
... 
-2

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

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