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


Como yo lo entiendo, .bat es la vieja convención de nombres de 16 bits, y .cmd es para Windows de 32 bits, es decir, comenzando con NT. Pero continúo viendo archivos .bat en todas partes, y parecen funcionar exactamente igual usando cualquiera de los sufijos. Asumiendo que mi código nunca necesitará ejecutarse en algo más antiguo que NT, ¿realmente importa de qué manera nombro mis archivos por lotes, o hay alguna gotcha esperándome usando el sufijo incorrecto?


625
2017-09-29 14:39


origen


Respuestas:


De este grupo de noticias publica por Mark Zbikowski él mismo:

Las diferencias entre .CMD y .BAT en lo que respecta a CMD.EXE   son: Con extensiones habilitadas, RUTA / APENDICE / ENTRAR / CONFIG / ASSOC en .CMD   los archivos configurarán ERRORLEVEL independientemente del error. .BAT establece ERRORLEVEL   solo en errores


381
2017-09-29 14:41



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 usó en la serie de sistemas operativos Win9x.
  2. cmd.exe es el procesador de comandos de 32 bits en Windows NT (los sistemas operativos de 64 bits de Windows 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ó a 16 bits (pero era, no obstante, un programa en modo protegido 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 fue de 32 bits en 1992, es cmd sigue siendo un programa OSx 2x de 16 bits.
  3. los ComSpec variable env define qué programa se inicia por .bat y .cmd guiones. (Comenzando con WinNT esto predeterminado para cmd.exe.)
  4. cmd.exe es compatible con versiones anteriores command.com.
  5. Un script que está 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í hay 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
  • Completar pestaña
  • 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 (existió 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 7 de 64 bits. El orden de ejecución está controlado por la variable de entorno PATHEXT. Ver Orden en la que Símbolo del sistema ejecuta archivos para más detalles.

Referencias

wikipedia: Comparación de las conchas de comando


364
2017-08-17 18:13



Estas respuestas son demasiado largas y se centran en el uso interactivo. Las diferencias importantes son:

  • .cmdevita la ejecución inadvertida en sistemas que no sean NT.
  • .cmd habilita los comandos incorporados para cambiar Errorlevel a 0 en caso de éxito.

Editar: las Extensiones de comandos están activadas por defecto en los archivos .bat y .cmd en Windows 2000 o posterior.

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


42
2017-09-29 14:41



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

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

Este comportamiento revela una sutil   característica de Windows NT que es muy   importante. El shell de MS-DOS de 16 bits   (COMMAND.COM) que se envía con Windows   NT está especialmente diseñado para Windows   NUEVO TESTAMENTO. Cuando se ingresa un comando para   ejecución por este shell, no lo hace   realmente ejecutarlo. En cambio,   empaqueta el texto de comando y lo envía   a un shell de comandos CMD.EXE de 32 bits para   ejecución. Porque todos los comandos son   realmente ejecutado por CMD.EXE (el   Shell de comandos de Windows NT), el de 16 bits   shell hereda todas las características y   instalaciones de Windows NT completo   cáscara.


25
2017-07-07 22:47



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

Hace varios meses, durante el curso de un proyecto, tuvimos que descubrir por qué algunos programas que queríamos ejecutar bajo CMD.EXE, de hecho, se ejecutaban bajo COMMAND.COM. El "programa" en cuestión era un archivo .BAT muy viejo, que aún se ejecuta diariamente.

Descubrimos que la razón por la que el archivo por lotes se ejecutó en COMMAND.COM es que se inició desde un archivo .PIF (también antiguo). Como las configuraciones de memoria especiales disponibles solo a través de un PIF se han vuelto irrelevantes, las reemplazamos con un atajo de escritorio convencional.

El mismo archivo de proceso por lotes, iniciado desde el acceso directo, se ejecuta en CMD.EXE. Cuando lo piensas, esto tiene sentido. El motivo por el que nos tomó tanto tiempo resolverlo 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.


15
2018-02-05 14:46



Dado que la publicación original se refería a las consecuencias del uso de .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:

  • entrando nombre del archivo o nombre del archivo.bat en la línea de comando ejecutará el archivo .bat

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


13
2017-11-22 17:04



Aún así, en Windows 7, los archivos BAT también tienen esta diferencia: si alguna vez crea 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>

10
2017-09-29 14:47



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, debe ser más rápido (no se nota en los archivos cortos) y más estable a medida que bat se ejecuta bajo el entorno de 16 bits emulado por NTVDM.


8
2017-09-29 17:40



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


3
2017-10-01 23:51