Archivos por lotes de Windows: .bat vs .cmd?

Como yo lo entiendo, .bat es la antigua convención de nomenclatura de 16 bits, y .cmd es para Windows de 32 bits, es decir, a partir de NT. Pero sigo viendo archivos .bat en todas partes, y parecen funcionar exactamente igual usando cualquiera de los sufijos. Suponiendo que mi código nunca necesitará ejecutarse en nada más antiguo que NT, ¿realmente importa de qué manera nombre mis archivos por lotes, o hay algunos Gotcha esperándome usando el sufijo incorrecto?

preguntado el 29 de septiembre de 08 a las 12:09

Solo para aumentar la confusión, ahora también tenemos archivos .ps1. -

si no me equivoco, los archivos .ps1 deberían ser un archivo de Windows Power Shell. Aunque podría estar equivocado. -

@ CMS_95 ese es un consejo correcto y bueno -

Quiero votar a favor de esto, pero ahora mismo es 777 :-) -

13 Respuestas

De esta publicación de grupo de noticias by marca zbikowski él mismo:

Las diferencias entre .CMD y .BAT en lo que respecta a CMD.EXE son: Con las extensiones habilitadas, PATH / APPEND / PROMPT / SET / ASSOC en archivos .CMD establecerá ERRORLEVEL independientemente del error. .BAT establece ERRORLEVEL solo en errores.

En otras palabras, si ERRORLEVEL se establece en un valor distinto de 0 y luego ejecuta uno de esos comandos, el ERRORLEVEL resultante será:

  • dejado solo en su valor distinto de 0 en un archivo .bat
  • restablecer a 0 en un archivo .cmd.

Respondido 24 Oct 18, 09:10

¿Eso implica que el uso de un script .bat no devolvería un valor ERRORLEVEL 0 en caso de éxito? Si eso es cierto, nunca lo noté. - djangofan

Creo que significa que si ERRORLEVEL se configuró en un valor distinto de 0, luego ejecuta uno de esos comandos, se dejará solo (no 0) en un archivo .bat pero se restablecerá a 0 en un archivo .cmd. Pero, siendo Windows lo que es, es muy posible que en realidad haga que una voz incorpórea te diga, en latín de cerdo, "¡reinicia ERRORLEVEL tú mismo si te importa tanto!". - Científico loco

Creo que está diciendo que solo esos comandos específicos harían las diferentes acciones de establecer / no establecer. Otros funcionarán como de costumbre. Psicodatos

Entiendo ahora. Actualicé mi esencia. Aparentemente, no (re) establece el nivel de error al llamar a un set var=.. declaración. Lo cual es extraño, porque asumí que era el comportamiento esperado. Se pueden argumentar a favor de ambos. Me quedaré con los archivos .bat. :-) - kodybrown

Nota: el comando APPEND ha sido reemplazado por el comando DPATH no documentado, aunque DPATH /? todavía enumera el comando como APPEND. Además, el artículo de Wiki se ha corregido en su mayor parte, excepto que no incluye DPATH. - dbenham

Aquí hay una compilación de información verificada de las diversas respuestas y referencias citadas en este hilo:

  1. command.com es el procesador de comandos de 16 bits introducido en MS-DOS y también se utilizó en la serie de sistemas operativos Win9x.
  2. cmd.exe es el procesador de comandos de 32 bits en Windows NT (los sistemas operativos Windows de 64 bits también tienen una versión de 64 bits). cmd.exe nunca fue parte de Windows 9x. Se originó en OS / 2 versión 1.0, y la versión OS / 2 de cmd comenzó de 16 bits (pero, no obstante, era un programa de modo protegido completamente desarrollado con comandos como start). Windows NT heredado cmd desde OS / 2, pero la versión Win32 de Windows NT comenzó con 32 bits. Aunque OS / 2 pasó a 32 bits en 1992, su cmd siguió siendo un programa OS / 16 2.x de 1 bits.
  3. Las ComSpec La variable env define qué programa es lanzado por .bat y .cmd guiones. (A partir de WinNT, este valor predeterminado es cmd.exe.)
  4. cmd.exe es compatible con versiones anteriores command.com.
  5. Un guión diseñado para cmd.exe puede ser nombrado .cmd para evitar la ejecución accidental en Windows 9x. Esta extensión de nombre de archivo también se remonta a OS / 2 versión 1.0 y 1987.

Aquí está una lista de cmd.exe funciones que no son compatibles con command.com:

  • Nombres de archivo largos (que superan el formato 8.3)
  • Historial de comandos
  • Finalización de tabulación
  • Personaje de escape: ^ (Usar para: \ & | > < ^)
  • Pila de directorio: PUSHD/POPD
  • Aritmética de enteros: SET /A i+=1
  • Buscar / Reemplazar / Subcadena: SET %varname:expression%
  • Sustitución de comando: FOR /F (existía antes, se ha mejorado)
  • Funciones: CALL :label

Orden de ejecución:

Si las versiones .bat y .cmd de un script (test.bat, test.cmd) están en la misma carpeta y ejecuta el script sin la extensión (prueba), de forma predeterminada se ejecutará la versión .bat del script, incluso en Windows 64 de 7 bits. La variable de entorno PATHEXT controla el orden de ejecución. Ver Orden en el que el símbolo del sistema ejecuta los archivos para más información.

Referencias:

wikipedia: Comparación de proyectiles de comando

contestado el 23 de mayo de 17 a las 13:05

Varios puntos menores: 1) .bat no necesariamente invoca command.com - aparentemente, cuando se invoca command.com es un misterio un poco complejo; 2) command.com se introdujo con MS-DOS; 3) cmd.exe puede ejecutar la mayoría de los scripts de command.com, pero hay algunas cosas menores de command.com que no funcionan en cmd. - miguel rebabas

cmd.exe se introdujo con NT 4.0, creo, no con Windows 95. - FlySwat

Chris: consulte la versión actual del artículo de Wikipedia, esp. el comentario de Mark Zbikowski en grupos.google.com/group/… - Mark

Solo para agregar algo de información sobre este asunto: dir filename es el mismo que dir filename.* en command.com; el comodín es necesario en cmd.exe. En command.com rem Create an empty file > empty.txt obras; no en cmd.exe. - Aacini

Solo un poco de esto parece ser relevante para la pregunta del OP, que trata sobre la diferencia entre .bat y .cmd, no la diferencia entre command.com y cmd.exe. Mientras lo leo, la pregunta es sobre la diferencia entre un archivo .bat y un archivo .cmd, en igualdad de condiciones. - Stewart

Estas respuestas son demasiado largas y se centran en el uso interactivo. Las diferencias importantes para la creación de scripts son:

  • .cmd previene la ejecución inadvertida en sistemas que no son NT.
  • .cmd permite que los comandos integrados cambien el nivel de error a 0 en caso de éxito.

No es tan emocionante, ¿eh?

Solía ​​haber una serie de funciones adicionales habilitadas en .cmd archivos, llamados extensiones de comando. Sin embargo, ahora están habilitados de forma predeterminada para ambos .bat y .cmd archivos en Windows 2000 y posterior.

En pocas palabras, en 2012 y más allá, recomiendo usar .cmd exclusivamente.

Respondido el 09 de enero de 20 a las 02:01

En mi opinión, ese es el punto principal. Utiliza .cmd como extensión para scripts más nuevos cuando quiere asegurarse de que no se ejecuten en sistemas operativos antiguos de 16 bits, o si no está seguro de que funcionarán. - Oliver

Realmente aprecio las respuestas concisas, pragmáticas y claras sobre toneladas de muros de respuestas inútiles, similares a las de una clase universitaria. - Núcleo líquido

¡Soy profesor universitario y estoy de acuerdo con @Liquid Core! Las respuestas concisas, pragmáticas y claras son la forma en que aprendemos (cuando aún no sabemos algo). Entonces, de alguna manera, una vez que lo entendemos, sentimos la necesidad de explicarlo de una manera abstracta e incomprensible. Extraño. ¡Buena observación! - Eureka

No, no importa en lo más mínimo. En NT, las extensiones .bat y .cmd hacen que el procesador cmd.exe procese el archivo exactamente de la misma manera.

Información adicional interesante sobre command.com frente a cmd.exe en sistemas de clase WinNT de MS TechNet (http://technet.microsoft.com/en-us/library/cc723564.aspx):

Este comportamiento revela una característica bastante sutil de Windows NT que es muy importante. El shell de MS-DOS de 16 bits (COMMAND.COM) que se incluye con Windows NT está especialmente diseñado para Windows NT. Cuando se ingresa un comando para su ejecución por este shell, en realidad no lo ejecuta. En su lugar, empaqueta el texto del comando y lo envía a un shell de comandos CMD.EXE de 32 bits para su ejecución. Debido a que CMD.EXE (el shell de comandos de Windows NT) ejecuta todos los comandos, el shell de 16 bits hereda todas las características y facilidades del shell completo de Windows NT.

Respondido el 30 de Septiembre de 08 a las 00:09

Puede importar; como el texto del enlace menciona, las diferencias son sutiles. - gringo suave

Puede forzar a command.com a ejecutar un comando DOS especificándolo en la línea de comando. Ver command /c ver versus iniciar command.com y escribir ver. - doctorado443322

El nombre importa: D ¡Vi muchos .bat de chicos del pasado! Utilice .cmd! Tampoco puedo creer que NT todavía se use hoy ... - hfrmóvil

@hfrmobile: Cuando mencioné 'NT' me refería básicamente a todas las versiones de Windows que estamos basadas en NT (y no 9x). Entonces, esencialmente NT, Win2k y todas las versiones de Windows para el escritorio o el servidor desde XP. Y el nombre del archivo puede dar una idea de la mentalidad y el estilo de codificación de la persona que escribió el archivo, pero en cuanto al intérprete, no hay diferencia. - miguel rebabas

RE: Aparentemente, cuando se invoca command.com es un misterio un tanto complejo;

Hace varios meses, durante el curso de un proyecto, tuvimos que averiguar por qué algunos programas que queríamos ejecutar bajo CMD.EXE estaban, de hecho, ejecutándose bajo COMMAND.COM. El "programa" en cuestión era un archivo .BAT muy antiguo, que todavía se ejecuta a diario.

Descubrimos que la razón por la que el archivo por lotes se ejecutó en COMMAND.COM es que se estaba iniciando desde un archivo .PIF (también antiguo). Dado que los ajustes de configuración de memoria especiales disponibles solo a través de un PIF se han vuelto irrelevantes, lo reemplazamos con un acceso directo de escritorio convencional.

El mismo archivo por lotes, iniciado desde el acceso directo, se ejecuta en CMD.EXE. Cuando lo piensas, esto tiene sentido. La razón por la que tardamos tanto en averiguarlo se debió en parte al hecho de que habíamos olvidado que su artículo en el grupo de inicio era un PIF, porque había estado en producción desde 1998.

Respondido 07 Jul 12, 23:07

¿Qué sistema operativo era este? ¿Algo antes de XP? - phk

Aún así, en Windows 7, los archivos BAT también tienen esta diferencia: si alguna vez crea los archivos TEST.BAT y TEST.CMD en el mismo directorio, y ejecuta TEST en ese directorio, ejecutará el archivo 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>

respondido 22 nov., 14:17

Lo hace porque test.bat está alfabéticamente antes de test.cmd. Windows realiza una finalización codiciosa. - David

@David: No es cierto. Esto sucede porque en PATHEXT variable, la extensión .BAT se coloca antes de .CMD (como se muestra en esta respuesta). Si modifica este orden en PATHEXT, en su lugar se ejecutará test.cmd. - Aacini

Hmm, esperaba que estuvieran en el otro orden; Supongo que MS debe haber descubierto (o asumido) que algún software existente envió archivos .CMD y archivos .BAT con el mismo nombre de base, donde los archivos .CMD, por supuesto, no estaban pensados ​​como entrada para el cmd (aún no enviado). exe, pero podría haber sido muchas otras cosas: comandos para algunos otros shell, un script de configuración leído por la aplicación, o algún tipo de binario de aplicación, por ejemplo. (Al menos, esa es mi comprensión de la forma habitual en que la EM termina con un comportamiento aparentemente subóptimo). SamB

También vale la pena señalar que el directorio actual viene antes que otros directorios en el PATH variable de entorno independientemente de la extensión. - Pavofantasma

Dado que la publicación original trataba sobre las consecuencias de usar .bat o .cmd sufijo, no necesariamente los comandos dentro el archivo...

Otra diferencia entre .bat y .cmd es que si existen dos archivos con el mismo nombre de archivo y ambas extensiones, entonces:

  • que entran a los nombre de archivo or nombre de archivo.bat en la línea de comando ejecutará el archivo .bat

  • para ejecutar el archivo .cmd, debe ingresar nombre de archivo.cmd

Respondido 05 Feb 14, 14:02

¿Eh? Si pongo un archivo cmd en mi directorio, no tengo que especificar la extensión del archivo para invocarlo. Ejemplo: echo notepad.exe% *> np.cmd Entonces, si escribo "np mytextfilename.txt", aparecerá el bloc de notas. No tengo que escribir "np.cmd" para invocarlo. - jon davis

@ stimpy77: esto es cierto si np.cmd es el único archivo con ese nombre, pero "si existen dos archivos con el mismo nombre de archivo y ambas extensiones", entonces la única forma de ejecutar el .cmd es incluyendo su extensión ... - Aacini

Esta es una necesidad para resolver la ambigüedad de cualquier shell, nada que ver con las diferencias técnicas entre .cmd y .bat. Probablemente sea porque filename.bat precede al filename.cmd alfabéticamente. - jon davis

En realidad, depende de la PATHEXT Variable ambiental. El orden en el que aparecen las extensiones es el orden de precedencia si no se especifica una extensión. También cabe mencionar que no es necesario especificar una extensión para los archivos cuya extensión aparece en la variable env. - ricardo zorio

todo lo que funcione en un lote debería funcionar en un cmd; cmd proporciona algunas extensiones para controlar el entorno. Además, cmd se ejecuta en un nuevo intérprete de cmd y, por lo tanto, debería ser más rápido (no se nota en archivos cortos) y más estable, ya que bat se ejecuta en el entorno de 16 bits emulado de NTVDM.

Respondido el 29 de Septiembre de 08 a las 15:09

No debería hacer ninguna diferencia en la velocidad. .bat no se ejecuta en DOS en NT. Un VDM solo se inicia si un programa lo necesita, y ni siquiera es compatible con Windows de 64 bits, aunque creo que .bat sí lo es. - gringo suave

La ejecución de archivos .cmd y .bat es diferente porque en una variable de nivel de error .cmd puede cambiar en un comando que se ve afectado por extensiones de comando. De eso se trata realmente.

Respondido 15 ago 17, 19:08

De grosero ^. ^ Hay diferencias en el lenguaje de comandos utilizado para cada uno (los archivos .bat obtienen una versión de compatibilidad). Algunos de estos se pueden ilustrar con este script de aquí: @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 - zask

En los archivos .cmd, cada comando establece el nivel de error, en los archivos .bat, algunos comandos dejan el nivel de error sin cambios, como se describe en la respuesta aceptada: Jeb

BAT fue creado para interactuar con COMMAND.COM, el intérprete de comandos de DOS. Microsoft adoptó la mayoría de los comandos de DOS en su nuevo intérprete llamado CMD. EXE. CMD fue creado para interactuar con CMD.EXE y rompe la compatibilidad con COMMAND.COM. principalmente conocido por cómo manejan la variable errorlevel. Cuando se usa BAT, esta variable solo se cambia una vez que ocurre un error real y no se produce ningún cambio de estado cuando cada comando se ejecuta correctamente. Esto no es cierto para CMD ya que la variable de nivel de error aún cambiaría de estado incluso si no se producen errores. - zask

Creo que si cambia el valor de la variable de entorno ComSpec a %SystemRoot%system32\cmd.exe(CMD) entonces no importa si la extensión del archivo es .BAT or .CMD. No estoy seguro, pero esto puede ser incluso el predeterminado para WinXP y versiones posteriores.

Respondido 26 ago 19, 16:08

Un poco fuera de tema, pero ¿ha considerado Host de secuencias de comandos de Windows? Puede que le resulte más agradable.

Respondido 08 Oct 09, 22:10

De hecho, PowerShell, que desaprueba WSH / cscript.exe. - jon davis

@ stimpy77 Cierto, aunque powershell me parece bastante terrible. - Marcin

Encuentro WSH mucho peor. Supongo que todo depende de lo que estemos midiendo como "terrible". PowerShell tiene un tiempo de inicio atroz. Todo es absolutamente maravilloso en mi opinión. - jon davis

Disculpe el formato, pero para acelerar el tiempo de inicio de PSH, intente ejecutar: Set-Alias ​​ngen @ (dir (join-path $ {env: \ windir} "Microsoft.NET \ Framework") ngen.exe -recurse | sort -descending lastwritetime) [0] .fullName [NUEVA LÍNEA AQUÍ] [appdomain] :: currentdomain.getassemblies () | % {ngen $ _. location} - mjbnz

Completamente fuera de tema. - Perro feliz

La extensión no hace ninguna diferencia.

Hay ligeras diferencias entre COMMAND.COM manejo del archivo vs CMD.EXE.

Respondido 26 ago 19, 15:08

una diferencia:

Los archivos .cmd se cargan en la memoria antes de ejecutarse. Los archivos .bat ejecutan una línea, leen la siguiente línea, ejecutan esa línea ...

puede encontrar esto cuando ejecuta un archivo de script y luego lo edita antes de que termine de ejecutarse. Los archivos bat se estropearán con esto, pero los archivos cmd no.

Respondido 03 Abr '10, 21:04

Como se ha establecido, la variable env de ComSpec define qué programa se inicia, ¿básicamente está diciendo que command.com lee el archivo una línea a la vez, mientras que cmd.exe carga previamente el archivo en la memoria? ¿Puede citar una referencia sobre esto? - chris noe

Es incorrecto para Vista y XP, ambos tipos de archivos se leen línea por línea. Si pausa el archivo .cmd o .bat y lo edita, se ejecutará el nuevo código: Jeb

Uno podría debatir si es línea por línea, porque si pausa la ejecución en el medio del archivo de comando y agrega un carácter al principio, al reanudar el analizador se apagará un carácter, posiblemente desechando el resto de su script. - usuario315772

No debe debatir .bat y .cmd no difiere de esa manera. Ambos siempre se leen línea por línea. Puedes probarlo si no crees. Cree un archivo por lotes que tenga echo 1&pause luego ejecútelo. Ya verás 1 y Press any key to continue.... Mientras está en pausa, agregue una nueva línea echo 2&pause con editor externo. Presione una tecla. Ya verás 2 y Press any key to continue.... Incluso puedes intentar agregar echo 3&pause al principio. Cuando vuelva a presionar una tecla, verá 2. - veneno

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.