Fichiers Windows batch:.bat contre cmd?

d'après ce que j'ai compris, .bat est l'ancienne convention de nommage à 16 bits, et .cmd est pour les fenêtres à 32 bits, c'est-à-dire commençant par NT. Mais je continue de le voir .les fichiers bat partout, et ils semblent fonctionner exactement la même avec les deux suffixe. En supposant que mon code n'aura jamais besoin de s'exécuter sur quelque chose de plus ancien que NT, est-ce vraiment important de quelle façon je nomme mes fichiers batch, ou y a-t-il quelque gotcha qui m'attend en utilisant le mauvais suffixe?

636
demandé sur Ross Ridge 2008-09-29 18:39:07

15 réponses

à Partir de ce groupe de presse publication par Marque Zbikowski lui-même:

les différences entre .CMD and .BAT aussi loin que CMD.L'EXE est concernée sont: avec extensions activées, chemin/ajoute/invite/SET / ASSOC in .CMD les fichiers définiront ERRORLEVEL indépendamment de l'erreur. .BAT sets ERRORLEVEL seulement sur les erreurs.

388
répondu Ben Hoffstein 2018-04-26 10:20:29

voici une compilation d'informations vérifiées à partir des différentes réponses et les références citées dans ce fil de discussion:

  1. command.com est le processeur de commande 16 bits introduit dans MS-DOS et a également été utilisé dans la série de systèmes D'exploitation Win9x.
  2. cmd.exe est le processeur de commande 32 bits de Windows NT (Windows OSS 64 bits ont également une version 64 bits). cmd.exe n'a jamais fait partie de Windows 9x. Il provient D'OS / 2 version 1.0, et la version OS/2 de cmd a commencé 16 bits (mais était néanmoins un programme de mode protégé avec des commandes comme start ). Windows NT a hérité de cmd de OS/2, mais la version Win32 de Windows NT a commencé à 32 bits. Bien que L'OS/2 soit passé de 32 bits en 1992, son cmd est resté un OS / 21 16 bits.x programme.
  3. la variable ComSpec définit le programme lancé par les scripts .bat et .cmd . (En commençant par Par défaut, c'est cmd.exe .)
  4. cmd.exe est compatible avec command.com .
  5. un script qui est conçu pour cmd.exe peut être nommé .cmd pour empêcher l'exécution accidentelle sur Windows 9x. Cette extension de nom de fichier date également de la version 1.0 et 1987 D'OS/2.

Voici une liste de cmd.exe caractéristiques qui ne sont pas prises en charge par command.com :

  • longs noms de fichier (dépassant le format 8.3)
  • histoire du commandement
  • "1519280920 Onglet" achèvement
  • Escape character: ^ (utiliser pour: \ & | > < ^ )
  • pile de répertoires: PUSHD / POPD
  • arithmétique entière: SET /A i+=1
  • Rechercher/Remplacer / Soustraire: SET %varname:expression%
  • substitution de commande: FOR /F (existait avant, a été améliorée)
  • fonctions: CALL :label

ordre d'exécution:

si les deux .chauve-souris et .les versions cmd d'un script (test.chauve-souris, test.cmd) sont dans le même dossier et vous exécutez le script sans l'extension (test), par défaut le .la version bat du script s'exécute, même sur Windows 7 64 bits. L'ordre d'exécution est contrôlé par la variable D'environnement PATHEXT. Voir ordre dans lequel la commande invite exécute les fichiers pour plus de détails.

, les Références:

wikipédia: Comparaison des interfaces de commande

368
répondu Chris Noe 2017-05-23 12:18:22

ces réponses sont un peu trop longues et axées sur l'utilisation interactive. Les différences importantes sont:

  • .cmd empêche l'exécution par inadvertance sur des systèmes non-NT.
  • .cmd permet aux commandes intégrées de changer le niveau d'erreur à 0 en cas de succès.

Modifier: les Extensions de commandes sont activées par défaut dans les deux .chauve-souris et .fichiers cmd sous Windows 2000 ou version ultérieure.

en 2012 et au-delà, je recommande d'utiliser .cmd exclusivement.

44
répondu Gringo Suave 2013-11-04 03:42:14

Pas - il n'a pas d'importance dans le moindre. On NT le .chauve-souris et .l'extension du cmd est à l'origine du cmd.exe processeur de traiter le fichier exactement de la même manière.

informations supplémentaires intéressantes sur command.com vs. cmd.exe on WinNT-class systems DE MS TechNet ( ) http://technet.microsoft.com/en-us/library/cc723564.aspx ):

ce comportement révèle un caractéristique de Windows NT qui est très important. Le shell MS-DOS de 16 bits (COMMAND.COM) que les bateaux avec des fenêtres NT est spécialement conçu pour les fenêtres NT. Quand une commande est entrée pour exécution par ce shell, il ne de l'exécution. Au lieu de cela, il empaquette la commande text et l'envoie à un CMD 32 bits.Commande exe shell pour exécution. Car toutes les commandes sont en fait exécuté par le CMD.EXE (le Windows NT commande shell), le 16-bit shell hérite de toutes les fonctionnalités et les installations des fenêtres pleines NT Shell.

25
répondu Michael Burr 2008-09-29 23:34:10

RE: apparemment quand command.com est invoqué est un peu d'un mystère complexe;

il y a plusieurs mois, au cours d'un projet, nous avons dû comprendre pourquoi certains programmes que nous voulions exécuter sous la direction de CMD.EXE étaient, en fait, en cours d'exécution COMMAND.COM. Le" programme " en question était très ancien .BAT file, qui fonctionne encore tous les jours.

nous avons découvert que la raison pour laquelle le fichier de lot COMMAND.COM est - ce que c'était être commencé à partir d'une .Fichier PIF (également ancien). Étant donné que les réglages spéciaux de configuration mémoire disponibles uniquement par L'intermédiaire d'un FIP sont devenus sans objet, nous les avons remplacés par un raccourci de bureau classique.

le même fichier batch, lancé à partir du raccourci, tourne en CMD.EXE. Quand vous pensez à ce sujet, cela fait sens. La raison pour laquelle il nous a fallu si longtemps pour le comprendre était en partie due au fait que nous avions oublié que son élément dans le groupe de démarrage était un PIF, parce qu'il était en production depuis 1998.

15
répondu David Gray 2012-07-07 22:47:44

Depuis le post original a été concernant les conséquences de l'utilisation de l' .bat ou .cmd suffixe , pas nécessairement les commandes à l'intérieur le fichier...

une autre différence entre .chauve-souris et .cmd est que si deux fichiers existent avec le même nom de fichier et les deux extensions, alors:

  • entrée nom de fichier ou nom de fichier .chauve-souris à la ligne de commande exécuter l' .fichier bat

  • pour exécuter l' .fichier cmd, vous devez entrer nom du fichier .cmd

13
répondu Rob at TVSeries.com 2014-02-05 14:46:29

encore, sur Windows 7, les fichiers BAT ont aussi cette différence : si jamais vous créez des fichiers TEST.Chauve-souris et le TEST.CMD dans le même répertoire, et si vous lancez TEST dans ce répertoire, il lancera le fichier 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
répondu tvCa 2014-11-22 17:04:09

tout ce qui fonctionne dans un lot doit fonctionner dans un cmd; cmd fournit quelques extensions pour contrôler l'environnement. de plus, cmd est exécuté par un nouvel interpréteur cmd et devrait donc être plus rapide (pas visible sur les fichiers courts) et plus stable lorsque bat tourne sous L'environnement NTVDM émulé 16bit

8
répondu Lorenzo Boccaccia 2008-09-29 14:47:51

je crois que si vous changez la valeur de la variable D'environnement ComSpec en %SystemRoot%system32\cmd.exe puis il n'a pas d'importance si l'extension du fichier est .BAT or .CMD. Je ne suis pas sûr, mais cela peut même être la valeur par défaut pour WinXP et au-dessus.

3
répondu Patrick Cuff 2008-09-29 17:40:39

Légèrement hors sujet, mais avez-vous considéré Windows Script Host ? Vous trouverez peut-être plus agréable.

3
répondu Marcin 2009-10-08 21:52:40

.cmd et .l'exécution de fichier bat est différente parce que dans un .cmd errorlevel variable il peut changer sur une commande qui est affectée par les extensions de commandes. Qui est-il vraiment.

3
répondu zask 2017-08-15 18:56:49

L'extension ne fait aucune différence. Il y a de légères différences entre COMMAND.COM gestion du fichier vs. CMD.EXE

2
répondu Waldo 2008-09-29 14:45:17

Voici une différence que j'ai découverte: EnableDelayedExpansion est requis dans .cmd fichiers.

Comme dans le cas des fichiers .bat , elle est implicite par défaut. ( Windows 10 )

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

cela fonctionne dans .bat mais est toujours found dans le cas d'un fichier .cmd .

Le changement de line 2 à ce qui suit fait que cela fonctionne comme prévu:

if %ERRORLEVEL% equ 0       (

et enfin pour le fichier .cmd cela fonctionne correctement:

setLocal EnableDelayedExpansion
...
if !ErrorLevel! equ 1       (
...
-2
répondu Ujjwal Singh 2016-11-04 23:24:56

comme étant un programmeur Cmd, et en regardant partout sur le web, il n'a vraiment pas d'importance laquelle vous utilisez, vous pouvez avoir un programme .bat sur un Windows 7, et l'exécuter sur un Windows 10. mais si vous devez le faire sur Windows 10, vous ne pourrez probablement pas exécuter toutes les commandes sur Windows 7. Un .cmd est exactement le même chemin, et exécute le même programme et les mêmes codes.

Toute la différence, c'est que ses un autre nom du même programme, tant comme il est relié à CMD.EXE , il exécute les mêmes commandes.

-3
répondu Shae Noble 2017-01-06 18:05:09

une différence:

.les fichiers cmd sont chargés en mémoire avant d'être exécutés. .les fichiers bat exécutent une ligne, lisent la ligne suivante, exécutent cette ligne...

vous pouvez trouver cela quand vous exécutez un fichier de script et puis l'éditez avant qu'il ne soit exécuté. les fichiers bat seront abîmés par ça, mais pas les fichiers cmd.

-10
répondu grey 2010-04-03 20:22:22