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

<p>насколько я понимаю, <code>.bat</code> - это старое 16-битное соглашение об именах, а <code>.cmd</code> - для 32-битной windows, то есть начиная с nt. но я продолжаю видеть файлы .bat везде, и они, кажется, работают точно так же, используя любой суффикс. предполагая, что мой код никогда не должен будет выполняться на чем-то более старом, чем nt, действительно ли имеет значение, каким образом я назову свои командные файлы, или есть какой-то <strong>понял</strong>, ожидающий меня с использованием неправильного суффикса?</p>

<p>от <a href="https://groups.google.com/group/microsoft.public.win2000.cmdprompt.admin/msg/ad9066638815812c">это сообщение группы новостей</a> от <a href="http://en.wikipedia.org/wiki/mark\_zbikowski">марк збиковский</a> сам:</p><blockquote> <p>различия между .cmd и .bat в том, что касается cmd.exe, заключаются в следующем: при включенных расширениях path/append/prompt/set/assoc в файлах .cmd установит errorlevel независимо от ошибки. .bat устанавливает errorlevel только при ошибках.</p> </blockquote><p>другими словами, если для errorlevel установлено значение, отличное от 0, а затем вы запустите одну из этих команд, в результате errorlevel будет:</p><ul> <li>оставить в покое, отличном от 0 в файле .bat</li> <li>сбросить до 0 в файле .cmd.</li> </ul>

<p>вот подборка проверенной информации из различных ответов и цитируемых ссылок в этой теме:</p><ol> <li><code>command.com</code> - это 16-битный командный процессор, представленный в ms-dos, который также использовался в операционных системах серии win9x.</li> <li><code>cmd.exe</code> - это 32-разрядный командный процессор в windows nt (64-разрядные ос windows также имеют 64-разрядную версию). <code>cmd.exe</code> никогда не был частью windows 9x. он возник в os/2 версии 1.0, а версия <code>cmd</code> для os/2 стала 16-разрядной (но, тем не менее, была полноценной программой защищенного режима с такими командами, как <code>start</code>). windows nt унаследовала <code>cmd</code> от os/2, но версия windows nt для win32 начала работать с 32-разрядной версией. хотя os/2 стала 32-битной в 1992 году, ее <code>cmd</code> оставалась 16-битной программой os/2 1.x.</li> <li>переменная <code>comspec</code> env определяет, какая программа запускается сценариями <code>.bat</code> и <code>.cmd</code>. (начиная с winnt, по умолчанию используется <code>cmd.exe</code>.)</li> <li><code>cmd.exe</code> обратно совместим с <code>command.com</code>.</li> <li>сценарий, разработанный для <code>cmd.exe</code>, может называться <code>.cmd</code> для предотвращения случайного выполнения в windows 9x. это расширение имени файла также восходит к os/2 версии 1.0 и 1987.</li> </ol><p>вот список функций <code>cmd.exe</code>, которые не поддерживаются <code>command.com</code>:</p><ul> <li>длинные имена файлов (превышающие формат 8.3)</li> <li>история команд</li> <li>завершение вкладки</li> <li>escape-символ: <code>^</code> (используется для: <code>\ & | > < ^</code>)</li> <li>стек каталога: <code>pushd</code>/<code>popd</code></li> <li>целочисленная арифметика: <code>set /a i+=1</code></li> <li>поиск/замена/подстрока: <code>set %varname:expression%</code></li> <li>подстановка команд: <code>for /f</code> (существовал ранее, был улучшен)</li> <li>функции: <code>call :label</code></li> </ul><p>порядок исполнения:</p><p>если обе версии скрипта .bat и .cmd (test.bat, test.cmd) находятся в одной папке, и вы запускаете скрипт без расширения (test), по умолчанию будет запущена версия скрипта .bat, даже на 64-битной windows 7. порядок выполнения контролируется переменной среды pathext. смотрите <a href="https://stackoverflow.com/questions/605101/order-in-which-command-prompt-executes-files-with-the-same-name-a-bat-vs-a-cmd-v">порядок, в котором командная строка выполняет файлы</a> для более подробной информации.</p><p>рекомендации:</p><ul> <li> <a href="http://www.ss64.com/ntsyntax/">cmd.exe</a> </li> <li> <a href="http://gregvogl.net/courses/os/handouts/doscmdref.pdf">command.com</a> </li> </ul><p>википедия: <a href="http://en.wikipedia.org/wiki/comparison\_of\_computer\_shells">сравнение командных оболочек</a> </p>

<p>эти ответы слишком длинные и ориентированы на интерактивное использование. важные отличия для сценариев:</p><ul> <li><code>.cmd</code> предотвращает непреднамеренное выполнение в системах, отличных от nt.</li> <li><code>.cmd</code> позволяет встроенным командам изменять уровень ошибки на 0 в случае успеха.</li> </ul><p>расширения команд по умолчанию включены в файлах .bat и .cmd в windows 2000 или более поздней версии.</p><p>в 2012 году и далее я рекомендую использовать исключительно <code>.cmd</code>.</p>

<p>нет - это не имеет значения ни в малейшей степени. в nt расширение .bat и .cmd приводят к тому, что процессор cmd.exe обрабатывает файл одинаково.</p><p>дополнительная интересная информация о command.com против cmd.exe в системах класса winnt от ms technet ( <a href="http://technet.microsoft.com/en-us/library/cc723564.aspx">http://technet.microsoft.com/en-us/library/cc723564.aspx</a> ):</p><blockquote> <p>такое поведение раскрывает довольно тонкую особенность windows nt, которая очень важна. 16-разрядная оболочка ms-dos (command.com), поставляемая с windows nt, специально разработана для windows nt. когда команда вводится для выполнения этой командной консолью, она фактически не выполняет ее. вместо этого он упаковывает текст команды и отправляет его 32-битной командной консоли cmd.exe для выполнения. поскольку все команды фактически выполняются cmd.exe (командная оболочка windows nt), 16-разрядная оболочка наследует все функции и возможности полной оболочки windows nt.</p> </blockquote>

<p><strong>re:</strong> видимо, когда вызывается command.com, это немного сложная загадка;</p><p>несколько месяцев назад, в ходе проекта, мы должны были выяснить, почему некоторые программы, которые мы хотели запускать в cmd.exe, фактически выполнялись в command.com. "программа", о которой идет речь, была очень старым файлом .bat, который все еще работает ежедневно.</p><p>мы обнаружили, что причина, по которой пакетный файл запускается в command.com, заключается в том, что он запускается из файла .pif (также древнего). поскольку специальные параметры конфигурации памяти, доступные только через pif, стали неактуальными, мы заменили их обычным ярлыком на рабочем столе.</p><p>тот же пакетный файл, запущенный из ярлыка, запускается в cmd.exe. когда вы думаете об этом, это имеет смысл. причина, по которой нам потребовалось так много времени, чтобы выяснить это, частично объяснялась тем, что мы забыли, что его элементом в группе стартапов был pif, потому что он был в производстве с 1998 года.</p>

<p>так как исходный пост касался последствий использования .bat или .cmd <em>суффикс</em>, необязательно команды <em>внутри</em> файл ...</p><p>еще одно отличие между .bat и .cmd состоит в том, что если существуют два файла с одинаковым именем и обоими расширениями, то:</p><ul> <li> <p>ввод <em>имя файла</em> или <em>имя файла</em>. bat в командной строке запустит файл .bat</p> </li> <li> <p>чтобы запустить файл .cmd, вы должны ввести <em>имя файла</em>. cmd</p> </li> </ul>

<p>тем не менее, в windows 7 файлы bat также имеют такую разницу: если вы когда-либо создадите файлы test.bat и test.cmd в одном каталоге и запустите test в этом каталоге, он запустит файл bat.</p><pre><code>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> </code></pre>

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

<p>немного не по теме, но рассматривали ли вы <a href="http://en.wikipedia.org/wiki/windows\_script\_host">windows scripting host</a> ? вы можете найти это лучше.</p>

<p>я считаю, что если вы измените значение переменной среды comspec на% systemroot% system32\cmd.exe, тогда не имеет значения, является ли расширение файла .bat или .cmd. я не уверен, но это может быть даже по умолчанию для winxp и выше.</p>

<p>выполнение файлов .cmd и .bat различно, поскольку в переменной .cmd errorlevel он может меняться в команде, на которую влияют расширения команд. это действительно так.</p>

<p>расширение не имеет значения. есть небольшие различия между command.com, обрабатывающим файл, и cmd.exe</p>