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, comenzando con NT. Pero sigo viendo archivos .bat en todas partes, y parecen funcionar exactamente igual usando cualquier sufijo. Suponiendo que nunca tendrá mi código para funcionar en cualquier cosa mayor que NT, es lo que realmente importa en qué dirección nombrar mis archivos por lotes, o hay alguna Gotcha me espera utilizando el sufijo mal?
windows
batch-file
cmd
Chris Noe
fuente
fuente
Respuestas:
De este grupo de noticias publicado por el propio Mark Zbikowski :
En otras palabras, si ERRORLEVEL está configurado en un valor distinto de 0 y luego ejecuta uno de esos comandos, el ERRORLEVEL resultante será:
fuente
set var=..
declaración. Lo cual es extraño, porque supuse que era un comportamiento esperado. Se podrían hacer argumentos para ambos. Me quedaré con los archivos .bat. :-)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.Aquí hay una compilación de información verificada de las diversas respuestas y referencias citadas en este hilo:
command.com
es el procesador de comandos de 16 bits introducido en MS-DOS y también se utilizó en la serie Win9x de sistemas operativos.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 decmd
16 bits comenzó (pero no obstante fue un programa de modo protegido completo con comandos comostart
). Windows NT heredócmd
de OS / 2, pero la versión Win32 de Windows NT comenzó con 32 bits. Aunque OS / 2 pasó a 32 bits en 1992,cmd
siguió siendo un programa OS / 2 1.x de 16 bits.ComSpec
variable env define qué programa es lanzado por.bat
y.cmd
scripts. (Comenzando con WinNT, este valor predeterminado escmd.exe
).cmd.exe
es compatible con versiones anteriorescommand.com
.cmd.exe
puede nombrar un script diseñado para.cmd
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
características que no son compatibles concommand.com
:^
(Uso para:\ & | > < ^
)PUSHD
/POPD
SET /A i+=1
SET %varname:expression%
FOR /F
(existía antes, se ha mejorado)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. Consulte el orden en que el símbolo del sistema ejecuta los archivos para obtener más detalles.
Referencias
wikipedia: Comparación de shells de comando
fuente
dir filename
es lo mismo quedir filename.*
en command.com; el comodín se requiere en cmd.exe. En command.comrem Create an empty file > empty.txt
funciona; no en cmd.exe.Estas respuestas son demasiado largas y se centran en el uso interactivo. Las diferencias importantes para las secuencias de comandos son:
.cmd
evita la ejecución involuntaria en sistemas que no son NT..cmd
permite que los comandos integrados cambien Errorlevel a 0 en caso de éxito.No es tan emocionante, ¿eh?
Solía haber una serie de características adicionales habilitadas en los
.cmd
archivos, llamadas Extensiones de comando. Sin embargo, ahora están activadas por defecto para ambos.bat
y.cmd
archivos en Windows 2000 y versiones posteriores.En pocas palabras: en 2012 y más allá, recomiendo usar
.cmd
exclusivamente.fuente
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 ):
fuente
command /c ver
versus iniciar command.com y escribir ver.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 "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ó 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 tomó 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.
fuente
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.
fuente
PATHEXT
variable la extensión .BAT se coloca antes de .CMD one (como se muestra en esta respuesta). Si modifica este orden en PATHEXT, el test.cmd se ejecutará en su lugar.PATH
variable de entorno, independientemente de la extensión.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:
ingresar el nombre del archivo o el nombre del archivo .bat en la línea de comando ejecutará el archivo .bat
para ejecutar el archivo .cmd, debe ingresar el nombre de archivo .cmd
fuente
PATHEXT
variable de entorno. El orden en que aparecen las extensiones es el orden de precedencia si no se especifica una extensión. También vale la pena mencionar que no es necesario especificar una extensión para los archivos cuya extensión aparece en la variable env.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
fuente
.bat
no se ejecuta bajo 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í.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 las extensiones de comando. Eso es todo realmente.
fuente
@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
Creo que si cambia el valor de la variable de entorno ComSpec a
%SystemRoot%system32\cmd.exe
(CMD), 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.fuente
Ligeramente fuera de tema, pero ¿ha considerado Windows Scripting Host ? Puede que te resulte más agradable.
fuente
La extensión no hace ninguna diferencia.
Existen ligeras diferencias entre
COMMAND.COM
el manejo del archivo vsCMD.EXE
.fuente
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. Esto dañará los archivos bat, pero los archivos cmd no.
fuente
.btm
archivos ("lote a memoria") empleados con los intérpretes de comandos de reemplazo de JP Software .echo 1&pause
luego lo ejecute. Verás1
yPress any key to continue...
. Mientras está en pausa, agregue una nueva líneaecho 2&pause
con un editor externo. Presione una tecla. Verás2
yPress any key to continue...
. Incluso puede intentar agregarecho 3&pause
al principio. Cuando presione una tecla después de eso nuevamente verá2
.