example commands batch windows batch-file cmd

windows - example - batch file commands



Archivos por lotes de Windows:.bat vs.cmd? (15)

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


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


Como programador de Cmd, y buscando en toda la web, realmente no importa cuál use, puede tener un programa .bat en un Windows 7 y ejecutarlo en un Windows 10. Pero si va a hacer en un Windows 10, probablemente no podrá ejecutar todos los comandos en un Windows 7. Un .cmd es exactamente de la misma manera, y ejecuta exactamente el mismo programa y los mismos códigos.

La única diferencia es que es un nombre diferente del mismo programa, siempre que esté conectado a CMD.EXE , ejecute los mismos comandos.


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


De este grupo de noticias publicado por el mismo Mark Zbikowski :

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

En otras palabras, si ERRORLEVEL se establece en no 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.

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.


La extensión no hace ninguna diferencia. Hay pequeñas diferencias entre COMMAND.COM que maneja el archivo y CMD.EXE


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>


Un poco fuera del tema, pero ¿has considerado Windows Scripting Host ? Puede que te resulte más agradable.


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.


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

Hace varios meses, durante el curso de un proyecto, tuvimos que averiguar por qué algunos programas que queríamos ejecutar bajo CMD.EXE, de hecho, se estaban ejecutando bajo COMMAND.COM. El "programa" en cuestión era un archivo .BAT muy antiguo, 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 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 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.