Pregunta

Según tengo entendido, .bat es la antigua convención de nomenclatura de 16 bits, y .cmd es para Windows de 32 bits, es decir, que comienza con NT.Pero sigo viendo archivos .bat en todas partes y parecen funcionar exactamente igual con cualquiera de los sufijos.Suponiendo que mi código nunca necesitará ejecutarse en nada anterior a NT, ¿realmente importa cómo nombre mis archivos por lotes o hay alguna entendido esperándome usando el sufijo incorrecto?

¿Fue útil?

Solución

De esta publicación del grupo de noticias por Mark Zbikowski 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 .CMD   los archivos establecerán ERRORLEVEL independientemente del error. .BAT establece ERRORLEVEL   solo en caso de errores.

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

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

Otros consejos

Aquí hay una recopilació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ó en 16 bits (pero, no obstante, era un programa en modo protegido completo con comandos como start).Windows NT heredado cmd de OS/2, pero la versión Win32 de Windows NT comenzó con 32 bits.Aunque OS/2 pasó a ser de 32 bits en 1992, su cmd siguió siendo un programa OS/2 1.x de 16 bits.
  3. El ComSpec La variable env define qué programa es lanzado por .bat y .cmd guiones.(A partir de WinNT, el 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í hay una lista de cmd.exe funciones que no son compatibles con command.com:

  • Nombres de archivos largos (que superan el formato 8.3)
  • Historial de comandos
  • Completar tabulación
  • Personaje 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 comando: FOR /F (existía antes, ha sido 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 (test), 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 el que el símbolo del sistema ejecuta los archivos para más detalles.

Referencias:

Wikipedia: Comparación de shells de comando

Estas respuestas son demasiado largas y se centraron en el uso interactivo. Las diferencias importantes para las secuencias de comandos son:

  • .cmd previene la ejecución involuntaria en sistemas que no son NT.
  • <=> permite que los comandos integrados cambien Errorlevel a 0 en caso de éxito.

Las extensiones de comando están activadas de manera predeterminada en los archivos .bat y .cmd en Windows 2000 o posterior.

En 2012 y más allá, recomiendo usar <=> exclusivamente.

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 vs. cmd.exe en sistemas de clase WinNT de MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx ):

  

Este comportamiento revela un aspecto bastante sutil   característica 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   NUEVO TESTAMENTO. Cuando se ingresa un comando para   ejecución por este shell, no   En realidad ejecutarlo. En cambio,   empaqueta el texto del comando y lo envía   a un shell de comando CMD.EXE de 32 bits para   ejecución. Porque todos los comandos son   ejecutado realmente por CMD.EXE (el   Shell de comandos de Windows NT), el de 16 bits   Shell hereda todas las características y   instalaciones del Windows NT completo   shell.

RE: Aparentemente cuando se invoca command.com es un misterio un poco 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 & Quot; programa & Quot; 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ó bajo COMMAND.COM es porque 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, lanzado desde el acceso directo, se ejecuta en CMD.EXE. Cuando lo piensas, esto tiene sentido. La razón por la que nos llevó tanto tiempo descubrirlo se debió en parte al hecho de que habíamos olvidado que su elemento en el grupo de inicio era un PIF, porque había estado en producción desde 1998.

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

  • ingresando nombre de archivo o 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

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>

todo lo que funciona 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 a medida que bat se ejecuta en el entorno de 16 bits emulado NTVDM

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 esto incluso puede ser el predeterminado para WinXP y superior.

Ligeramente fuera de tema, pero ¿ha considerado Windows Scripting Host ? Puede que le resulte más agradable.

La ejecución del archivo

.cmd y .bat es diferente porque en una variable de nivel de error .cmd puede cambiar en un comando afectado por las extensiones de comando. Eso es todo realmente.

La extensión no hace ninguna diferencia. Existen ligeras diferencias entre COMMAND.COM que maneja el archivo frente a CMD.EXE

Aquí hay una diferencia que descubrí: EnableDelayedExpansion es requerido en .cmd archivos.
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 found pero siempre es line 2 en el caso de un archivo <=>.
Cambiar <=> a lo siguiente hace que funcione como se esperaba:

if %ERRORLEVEL% equ 0       (

Y finalmente para el archivo <=> esto funciona correctamente:

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

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. Esto alterará los archivos bat, pero los archivos cmd no lo harán.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top