Насколько я понимаю, .bat
это старое 16-битное соглашение об именах, и оно .cmd
предназначено для 32-битной Windows, то есть начиная с NT. Но я продолжаю видеть файлы .bat везде, и они, кажется, работают точно так же, используя любой суффикс. Предполагая, что мой код никогда не должен будет выполняться на чем-то более старом, чем NT, действительно ли имеет значение, каким образом я называю свои командные файлы, или есть какие-то ошибки, ожидающие меня с использованием неправильного суффикса?
windows
batch-file
cmd
Крис Но
источник
источник
Ответы:
Из этой группы новостей проводки по Mark Zbikowski сам:
Другими словами, если для ERRORLEVEL установлено значение, отличное от 0, а затем вы запустите одну из этих команд, в результате ERRORLEVEL будет:
источник
set var=..
оператора. Что странно, потому что я предположил, что это было ожидаемое поведение. Аргументы могут быть сделаны для обоих. Я буду придерживаться .bat файлов. :-)DPATH /?
прежнему перечисляется как APPEND. Кроме того, статья Wiki с тех пор была в основном исправлена, за исключением того, что в ней нет DPATH.Вот подборка проверенной информации из различных ответов и цитируемых ссылок в этой теме:
command.com
16-разрядный командный процессор, представленный в MS-DOS и использовавшийся в операционных системах серии Win9x.cmd.exe
32-разрядный командный процессор в Windows NT (64-разрядные ОС Windows также имеют 64-разрядную версию).cmd.exe
никогда не был частью Windows 9x. Он появился в OS / 2 версии 1.0, а версия OS / 2cmd
стала 16-разрядной (но, тем не менее, была полноценной программой защищенного режима с такими командамиstart
). Windows NT унаследованаcmd
от 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
:^
(Используйте для:\ & | > < ^
)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. См. Порядок, в котором командная строка выполняет файлы для получения дополнительной информации.
Ссылки:
Википедия: Сравнение командных оболочек
источник
dir filename
же, какdir filename.*
в command.com; подстановочный знак требуется в cmd.exe. В command.comrem Create an empty file > empty.txt
работает; не в cmd.exe.Эти ответы слишком длинные и ориентированы на интерактивное использование. Важные отличия для сценариев:
.cmd
предотвращает непреднамеренное выполнение в системах, отличных от NT..cmd
позволяет встроенным командам изменить уровень ошибки на 0 в случае успеха.Не так интересно, а?
Раньше в
.cmd
файлах был включен ряд дополнительных функций , называемых расширениями команд. Однако теперь они включены по умолчанию как для файлов, так.bat
и.cmd
для Windows 2000 и более поздних версий.Итог: в 2012 году и далее я рекомендую использовать
.cmd
исключительно.источник
Нет - это не имеет значения ни в малейшей степени. В NT расширение .bat и .cmd приводят к тому, что процессор cmd.exe обрабатывает файл одинаково.
Дополнительная интересная информация о command.com против cmd.exe в системах класса WinNT от MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx ):
источник
command /c ver
против запуска command.com и ввода вер.RE: Очевидно, когда вызывается command.com, это немного сложная загадка;
Несколько месяцев назад, в ходе проекта, мы должны были выяснить, почему некоторые программы, которые мы хотели запустить под CMD.EXE, фактически выполнялись под COMMAND.COM. «Программа», о которой идет речь, была очень старым файлом .BAT, который все еще работает ежедневно.
Мы обнаружили, что причина, по которой пакетный файл запускается под COMMAND.COM, заключается в том, что он запускается из файла .PIF (также древнего). Поскольку специальные параметры конфигурации памяти, доступные только через PIF, стали неактуальными, мы заменили их обычным ярлыком на рабочем столе.
Тот же пакетный файл, запущенный из ярлыка, запускается в CMD.EXE. Когда вы думаете об этом, это имеет смысл. Причина, по которой нам потребовалось так много времени, чтобы выяснить это, частично объяснялась тем, что мы забыли, что его продукт в группе стартапов был PIF, потому что он был в производстве с 1998 года.
источник
Тем не менее, в Windows 7 файлы BAT также имеют эту разницу: если вы когда-либо создадите файлы TEST.BAT и TEST.CMD в одном каталоге и запустите TEST в этом каталоге, он запустит файл BAT.
источник
PATHEXT
переменной расширение .BAT размещается перед .CMD (как показано в этом ответе). Если вы измените этот порядок в PATHEXT, вместо этого будет выполнен test.cmd.PATH
переменной среды независимо от расширения.Так как исходный пост касался последствий использования суффикса .bat или .cmd , необязательно команды внутри файла ...
Еще одно отличие между .bat и .cmd заключается в том, что если существуют два файла с одинаковым именем и обоими расширениями, то:
ввод имени файла или имени файла .bat в командной строке запустит файл .bat
чтобы запустить файл .cmd, вы должны ввести имя файла .cmd
источник
PATHEXT
переменной среды. Порядок, в котором появляются расширения, есть порядок приоритета, если расширение не указано. Также стоит упомянуть, что нет необходимости указывать расширение для файлов, которые появляются в переменной env.все, что работает в пакете, должно работать в cmd; cmd предоставляет некоторые расширения для управления средой. Кроме того, cmd выполняется в новом интерпретаторе cmd и, следовательно, должен быть быстрее (незаметно для коротких файлов) и стабильнее, поскольку bat работает в эмулируемой 16-битной среде NTVDM.
источник
.bat
не работает под DOS в NT. VDM запускается, только если программа нуждается в этом, и даже не поддерживается в 64-битной Windows, хотя я считаю, что .bat есть.Выполнение файлов .cmd и .bat различно, поскольку в переменной .cmd errorlevel он может меняться в команде, на которую влияют расширения команд. Это действительно так.
источник
@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
Я считаю, что если вы измените значение переменной среды ComSpec на
%SystemRoot%system32\cmd.exe
(CMD), то не имеет значения, является ли расширение файла.BAT
или.CMD
. Я не уверен, но это может быть даже по умолчанию для WinXP и выше.источник
Немного не по теме, но рассматривали ли вы Windows Scripting Host ? Вы можете найти это лучше.
источник
Расширение не имеет значения.
Есть небольшие различия между
COMMAND.COM
обработкой файла противCMD.EXE
.источник
разница:
Файлы .cmd загружаются в память перед выполнением. Файлы .bat выполняют строку, читают следующую строку, выполняют эту строку ...
вы можете столкнуться с этим, когда вы выполняете файл сценария, а затем редактируете его, прежде чем он завершится. Файлы bat будут испорчены этим, а файлы cmd - нет.
источник
.btm
файлах («пакетной памяти»), которые используются с заменяющими интерпретаторами команд JP Software .echo 1&pause
затем выполняет его. Вы увидите1
иPress any key to continue...
. Пока пауза добавить новую строкуecho 2&pause
с внешним редактором. Нажмите кнопку. Вы увидите2
иPress any key to continue...
. Вы даже можете попробовать добавитьecho 3&pause
в начале. Когда вы нажмете клавишу после этого снова, вы увидите2
.