CMD/BAT: Различия между .cmd и .bat в Windows










Когда-то давно я задался вопросом "в чем разница между этими расширениями в последних версиях Windows". Делаю акцент именно на этом, потому что встречаются весьма частые ответы о том, что
— .bat для COMMAND.COM, а .cmd для CMD.EXE
— .bat это в Windows, а .cmd — это в OS/2
Все это далеко от ответов на поставленный вопрос. А ответ есть — https://stackoverflow.com/a/148991/3627676:
The differences between .CMD and .BAT as far as CMD.EXE is concerned are: With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL only on errors.
Различия между .CMD и .BAT в CMD.EXE следующие: при включенной опции ENABLEEXTENSIONS, встроенные команды PATH/APPEND/PROMPT/SET/ASSOC в .CMD файлах выставляют собственный код ошибки в ERRORLEVEL независимо от ошибки. .BAT файлы выставляют код ошибки в ERRORLEVEL только в случае ошибки.
Проиллюстрирую сказанное простым примером — скрипт вызывает несуществующую команду (естественно, не находит ее) и печатает строку подсказки. После первой команды выставляется код ошибки 9009, который мы отображаем сразу после вызова и после встроенной команды
Вывод .bat файла: команда prompt оказалась "прозрачной" для %ERRORLEVEL%
Вывод .cmd файла: здесь очевидно, что команда вернула свой код ошбки (ноль) и затерла код ошибки предыдущей команды
Различия незначительные, но могут попортить нервов на поиски решения проблемы в случае скрипта, аналогичном примеру. Этот пример лишний раз говорит в пользу первичной инициализации состояния и переменных.
Посмотрел описание команд — туманно и рекурсивно (сепульки и сепулькарии), а про код ошибки — ни слова.
Пакетные файлы Windows: .bat против .cmd?
Как я понимаю, .bat — это старое 16-битное соглашение об именах, а .cmd — для 32-разрядной Windows, то есть, начиная с NT. Но я по-прежнему вижу файлы .bat везде, и они, похоже, работают точно так же, используя любой суффикс. Предполагая, что моему коду никогда не понадобится работать на чем-то старше NT, действительно ли имеет значение, как я называю свои командные файлы, или есть ли gotcha, ожидающие меня, используя неправильный суффикс?
15 ответов
Различия между .CMD и .BAT в том, что касается CMD.EXE, заключаются в следующем: при включенных расширениях PATH/APPEND/PROMPT/SET/ASSOC в файлах .CMD устанавливает ERRORLEVEL независимо от ошибки. .BAT устанавливает ERRORLEVEL только для ошибок.
Другими словами, если для ERRORLEVEL установлено значение, отличное от 0, а затем вы запустите одну из этих команд, в результате ERRORLEVEL будет:
- оставить в покое с его ненулевым значением в файле .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 NT унаследовала cmd от OS/2, но версия Windows NT Win32 началась с 32-разрядной версии. Хотя OS/2 пошла на 32-разрядную версию в 1992 году, ее cmd оставалась 16-разрядной программой OS/2 1.x.
- Переменная ComSpec env определяет, какая программа запускается скриптами .bat и .cmd . (Начиная с WinNT это значение по умолчанию равно cmd.exe .)
- cmd.exe обратно совместим с command.com .
- A script, который предназначен для 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 script (test.bat, test.cmd) находятся в одной папке, и вы запускаете script без расширения (теста), по умолчанию версия .bat из script будет работать даже в 64-битной Windows 7. Порядок выполнения контролируется переменной среды PATHEXT. См. Заказ, в котором Command Prompt выполняет файлы для более подробной информации.
- cmd.exe
- command.com
Эти ответы слишком длинные и ориентированы на интерактивное использование. Важные отличия для сценариев:
- .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 NT специально разработан для Windows NT. Когда команда вводится для выполнение этой оболочкой, это не фактически выполнить его. Вместо этого упаковывает текст команды и отправляет ее для 32-разрядной командной оболочки CMD.EXE для выполнение. Поскольку все команды фактически выполненный CMD.EXE( Командная оболочка Windows NT), 16-разрядный shell наследует все функции и средства всей Windows NT оболочки.
RE: Очевидно, когда вызывается command.com, это немного сложная тайна;
Несколько месяцев назад, в ходе проекта, нам пришлось выяснить, почему некоторые программы, которые мы хотели запустить под CMD.EXE, на самом деле работали под командой COMMAND.COM. «Программа», о которой идет речь, была очень старым .BAT файлом, который по-прежнему работает ежедневно.
Мы обнаружили, что причина, по которой командный файл работает под COMMAND.COM, заключается в том, что он запускается из файла .PIF(также древнего). Поскольку настройки конфигурации специальной памяти, доступные только через PIF, стали неактуальными, мы заменили его обычным ярлыком на рабочем столе.
Тот же командный файл, запущенный из ярлыка, запускается в CMD.EXE. Когда вы думаете об этом, это имеет смысл. Причина, по которой нам так долго нужно было это понять, была частично связана с тем, что мы забыли, что ее элемент в группе запуска был PIF, поскольку он был в производстве с 1998 года.
Поскольку исходное сообщение касалось последствий использования суффикса .bat или .cmd, необязательно команды внутри файла.
Еще одно отличие между .bat и .cmd заключается в том, что если два файла существуют с тем же именем файла и обоими этими расширениями, то:
ввод имени файла или filename.bat в командной строке будет запущен .bat файл
чтобы запустить файл .cmd, вам нужно ввести filename.cmd
Тем не менее, в Windows 7 BAT файлы также имеют такую разницу: если вы когда-либо создавали файлы TEST.BAT и TEST.CMD в том же каталоге и запускали TEST в этом каталоге, он запускал бы BAT файл.
все, работающие в партии, должны работать в cmd; cmd предоставляет некоторые расширения для управления средой. Кроме того, cmd выполняется в новом интерпретаторе cmd и, следовательно, должен быть быстрее (не заметно на коротких файлах) и более стабильным, поскольку bat работает под эмулируемой 16-битной средой с поддержкой NTVDM
Bat и cmd в чем отличие
Well, that’s the question. I always call my batch files "name.cmd", because I’m not sure what would happen if I called it "name.bat". I assume it would still work, but what is the difference between the way Windows treats these two file extensions?
Or are they completely interchangeable, .bat being kept for backward-compatibility?
Grant Ward, a.k.a. Bigteddy
Answers
- Marked as answer by Bigteddy Friday, February 17, 2012 2:52 PM
I found a couple of pretty good articles on the topic that seem to go into a little more detail:
- Marked as answer by Bigteddy Friday, February 17, 2012 2:52 PM
As far as I know: ATM it has no effect what so ever. All current used Windows are based on NT "granfater" and can run .cmd code fine.
It had some effect when Win9x/ME line was still "alive" — .cmd would not run in command.com that was available on those platforms, so naming your script with .cmd extension would prevent you from ending up with lot of errors about wrong syntax/ command name.
Anyway: I like to name does files .cmd anyway, so that it obviuos what environment I’m pointing at. 😉
CMD vs BAT
By
Priya Pedamkar

Difference Between CMD and BAT
CMD vs BAT in this, BAT was the first extension used by Microsoft for batch files. This extension is used in any Microsoft system including the very first systems and the latest versions. BAT is the batch file that is used in DOS, OS/2 and Microsoft Windows. CMD files are newer version came into existence for batch files. The older systems will not know about CMD files and will run them partially which will throw an error for the batch files saved as CMD. CMD is the command prompt in the system and the programming language is called DOS batch language. Nowadays CMD is used by many.
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
Head to Head Comparison Between CMD and BAT (Infographics)
Below are the top 17 differences between CMD vs BAT:
Hadoop, Data Science, Statistics & others

Key Differences between CMD and BAT
Let’s discuss some of the major key differences:
- CMD has improved scripting because it is developed for Windows NT. BAT scripts are older version as it is developed for DOS command prompt.
- CMD file will not work in a 16-bit environment whereas BAT works in all the environments.
- CMD files have the current version of Microsoft language while BAT has the older version of the Microsoft language.
- CMD is backward compatible while BAT is not backward compatible.
- CMD runs in most command.com scripts whereas BAT by itself will not run in command.com scripts unless made to do so.
- CMD does not allow execution in non-NT systems. BAT scripts were made for running in all systems.
- To run a CMD script, we have to enter the filename.cmd whereas to run a BAT script, just the filename is sufficient for the program. This happens when both CMD and BAT files have the same filenames and are saved in the same directory.
- CMD provides extensions to run the files. BAT files do not need any extensions to run the program.
- CMD is faster and more stable when compared with BAT.
- The execution is both the scripts are different due to the error variable. The error variable is always reset to zero in CMD. The error variable remains the same unless and error is shown in BAT scripts.
- CMD was created as interaction with cmd.exe and does not have any compatibility with command.com though the commands run in command.com whereas BAT was created with command.com environment.
- CMD files are saved in the memory before execution but BAT files are not saved in the memory and execution happens line by line.
- We can edit the CMD files once after the execution and the files will not create any problem. But editing BAT files after execution will create a problem with the script and it may not run at all.
- Pressing the tab completes the code in CMD whereas in BAT the code execution does not happen in that manner.
- The file names are really long in CMD but in BAT the file names are not longer.
- CMD is used only in Windows-NT systems whereas BAT can be used in DOS and Windows.
Comparison of Table
Let’s discuss the top most comparison between CMD vs BAT:
| CMD | BAT |
| Even when the command is affected by the proper or successful command extensions, the error level variable is changed. | The error level variable changes when the error is shown and is visible. |
| CMD is executed in a cmd interpreter. | BAT runs in the NTDVM environment which was started as 16 bit and got upgraded with the new releases. |
| The cmd extension can be read-only in cmd.exe. | The bat extension can be read in command.com and cmd.exe. |
| When the error level is called using CMD, the error level is reset. | When the error level is called using BAT, the previous command is executed. |
| CMD has many advanced functions since it was developed later. | BAT does not have much-advanced functions and now is adapting with CMD for the functions. |
| CMD is not considered as an executable file type in win9x. Win2k and NT execute CMD files without raising any error. | The files in win9x are executed using BAT. Also, it executes files from other windows versions. |
| CMD files are supported in almost all versions of windows. | BAT files are not supported in the newer version of windows. |
| Cmd.exe directly executes CMD files. | Command.com sends BAT files to cmd.exe for the execution of files. |
| CMD scripts are written in the command prompt. Any type of script is run in command prompt and the extension is .cmd file. | Microsoft’s batch processing uses BAT files and is stored in .bat format. |
| Commands and utilities along with the programming language make CMD unique. | The program is just a batch script and is called a batch file. |
| The text file name is given in the command prompt to which helps in editing the .cmd file. | Any text editor such as notepad or MS word can be used to open .bat file for editing. |
| The files are not operated in sequence and user intervention is very much needed to support the files. | The files are operated in sequence and hence user intervention is not needed. Users can just direct the files. |
| CMD is the synonym often used for command prompt though command prompt runs many programs as directed. | BAT files are not always executed using command prompt and have their own way of execution. |
| CMD files are used in almost all programs. In order to check the software, version and many other purposes it is used. | BAT files help in starting the big programs in the Windows system and also for the maintenance. |
| CMD has a programming language to run the scripts and is a command interpreter. | BAT is a scripting language that has an interpreter. |
| CMD does not run a sequence of commands and hence we can say that CMD is safer than BAT. | When a BAT file is opened, it runs the sequence of commands and hence it is prone to security attacks. |
| CMD has an application in Android which makes it view, install and run CMD scripts. | BAT files cannot be used in Android as it is meant only for windows. |
Conclusion
Both CMD and BAT are used interchangeably by the user for the automation of repetitive tasks. Both have many similarities and can be considered as a simple programming language. The commands can be executed with or without parameters. Simple scripts are easily executed in both the programs and the commands are mostly similar.
Recommended Articles
This is a guide to CMD vs BAT. Here we discuss the key differences with infographics and comparison table. You can also go through our other suggested articles to learn more –