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




batch file example (10)

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 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ó a 16 bits (pero no obstante, era un programa en modo protegido completamente desarrollado con comandos como start ). Windows NT heredó el cmd de OS / 2, pero la versión Win32 de Windows NT comenzó con 32 bits. Aunque OS / 2 fue de 32 bits en 1992, su cmd siguió siendo un programa OS / 2 1.x de 16 bits.
  3. La variable de env ComSpec define qué programa se inicia con los .bat y .cmd . (A partir de WinNT, este valor predeterminado es cmd.exe ).
  4. cmd.exe es compatible con versiones anteriores de command.com .
  5. Una secuencia de comandos diseñada para cmd.exe puede denominarse .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 características de cmd.exe que no son compatibles con command.com :

  • Nombres de archivo largos (que exceden el formato 8.3)
  • Historia de comando
  • Completar la ficha
  • Carácter de escape: ^ (usar para: \ & | > < ^ )
  • Pila de directorios: PUSHD / POPD
  • Aritmética de enteros: SET /A i+=1
  • Buscar / Reemplazar / Subcadena: SET %varname:expression%
  • Sustitución de comandos: FOR /F (existía antes, se ha mejorado)
  • Funciones: CALL :label

Orden de Ejecución:

Si las versiones .bat y .cmd de una secuencia de comandos (test.bat, test.cmd) están en la misma carpeta y ejecuta la secuencia de comandos sin la extensión (prueba), de forma predeterminada, la versión .bat de la secuencia de comandos se ejecutará, incluso en Windows 7 de 64 bits. El orden de ejecución está controlado por la variable de entorno PATHEXT. Vea el orden en el que el símbolo del sistema ejecuta los archivos para obtener más detalles.

Referencias:

wikipedia: comparacion de shells de comando

Como 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 parece que funcionan exactamente igual con cualquiera de los dos sufijos. Suponiendo que mi código nunca tendrá que ejecutarse en algo más antiguo que NT, ¿realmente importa de qué manera nombro mis archivos por lotes, o hay algunos que me están esperando con el uso del sufijo incorrecto?


Aquí hay una diferencia que descubrí: la EnableDelayedExpansion se requiere en los archivos .cmd .
Donde, como en el caso de los archivos .bat , está implícito por defecto. ( Windows 10 )

dir *? | find /i "FOOBAR"
if ERRORLEVEL 0             (
set result="found"  ) else  (
set result="not found"  )
echo %result%

Esto funciona en .bat pero siempre se found en el caso de un archivo .cmd .
Cambiar la line 2 a lo siguiente hace que funcione como se espera:

if %ERRORLEVEL% equ 0       (

Y finalmente para el archivo .cmd esto funciona correctamente:

setLocal EnableDelayedExpansion
...
if !ErrorLevel! equ 1       (
...

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


Dado que la publicación original se refería a las consecuencias de usar el sufijo .bat o .cmd, no necesariamente los comandos dentro del archivo ...

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

  • al ingresar el nombre del archivo o el nombre del archivo .bat en la línea de comando, se ejecutará el archivo .bat

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


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

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

Edición: las extensiones de comando están activadas de forma predeterminada en los archivos .bat y .cmd en Windows 2000 o posterior.

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


La ejecución de los 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 las extensiones de comando. Eso es todo realmente.


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 interesante adicional 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 este comando ingresa un comando para su ejecución, no lo ejecuta realmente. 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 todos los comandos son ejecutados por CMD.EXE (el shell de comandos de Windows NT), el shell de 16 bits hereda todas las características y facilidades del shell completo de Windows NT.


Sin embargo, en Windows 7, los archivos BAT también tienen esta diferencia: si alguna vez creas los archivos TEST.BAT y TEST.CMD en el mismo directorio, y ejecutas 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>

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


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 ...

Puedes encontrar esto cuando ejecutas un archivo de script y luego lo editas antes de que termine de ejecutarse. Los archivos bat se desordenarán con esto, pero los archivos cmd no.







cmd