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

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

вопрос задан 29.09.2008
Chris Noe
17636 репутация

15 ответов


  • 388 рейтинг

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

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

    ответ дан Ben Hoffstein, с репутацией 85680, 29.09.2008
  • 368 рейтинг

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

    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. х программа.
    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 формат)
    • История команд
    • Завершение вкладки
    • Escape-символ: ^ (используется для: \ & | > < ^)
    • Стек каталогов: PUSHD/POPD
    • Целочисленная арифметика: SET /A i+=1
    • Поиск / замена / подстрока: SET %varname:expression%
    • Замена команды: FOR /F (существовал ранее, был улучшен)
    • Функции: CALL :label

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

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

    Справочные материалы:

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

    ответ дан Chris Noe, с репутацией 17636, 29.09.2008
  • 44 рейтинг

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

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

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

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

    ответ дан Gringo Suave, с репутацией 16831, 17.08.2012
  • 25 рейтинг

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

    Дополнительная интересная информация о команде. ком против CMD. EXE на системах класса WinNT от MS TechNet ( http: // technet. Microsoft. ком / EN-US / библиотека / cc723564. aspx ):

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

    ответ дан Michael Burr, с репутацией 277528, 29.09.2008
  • 15 рейтинг

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

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

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

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

    ответ дан David Gray, с репутацией 151, 7.07.2012
  • 13 рейтинг

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

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

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

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

    ответ дан Rob at TVSeries.com, с репутацией 1855, 5.02.2014
  • 10 рейтинг

    Тем не менее, в 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>
    
    ответ дан tvCa, с репутацией 542, 22.11.2014
  • 8 рейтинг

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

    ответ дан Lorenzo Boccaccia, с репутацией 4962, 29.09.2008
  • 3 рейтинг

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

    ответ дан Marcin, с репутацией 34446, 1.10.2008
  • 3 рейтинг

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

    ответ дан Patrick Cuff, с репутацией 22471, 29.09.2008
  • 3 рейтинг

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

    ответ дан zask, с репутацией 126, 18.10.2015
  • 2 рейтинг

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

    ответ дан Waldo, с репутацией 228, 29.09.2008
  • -2 рейтинг

    Вот одно различие, которое я обнаружил: EnableDelayedExpansion - это , требуется в .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       (
    ...
    
    ответ дан Ujjwal Singh, с репутацией 3574, 4.11.2016
  • -3 рейтинг

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

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

    ответ дан Shae Noble, с репутацией 5, 6.01.2017
  • -10 рейтинг

    разница:

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

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

    ответ дан grey, с репутацией 13, 3.04.2010