it-swarm.com.de

Windows Batch-Dateien: .bat vs .cmd?

Wie ich es verstehe, ist .bat die alte 16-Bit-Namenskonvention, und .cmd ist für 32-Bit-Windows, d. H. Beginnend mit NT. Aber ich sehe weiterhin überall .bat-Dateien und sie scheinen mit beiden Suffixen genau gleich zu funktionieren. Unter der Annahme, dass mein Code niemals auf etwas älterem als NT ausgeführt werden muss, ist es dann wirklich wichtig, wie ich meine Batch-Dateien benenne, oder gibt es einige gotcha, die auf mich warten, indem sie das falsche Suffix verwenden?

697
Chris Noe

Aus dieser Newsgroup-Beitrag von Mark Zbikowski sich selbst:

Die Unterschiede zwischen .CMD und .BAT in Bezug auf CMD.EXE sind: Bei aktivierten Erweiterungen setzen PATH/APPEND/Prompt/SET/ASSOC in .CMD-Dateien ERRORLEVEL, unabhängig von Fehlern. .BAT setzt ERRORLEVEL nur bei Fehlern.

Mit anderen Worten, wenn ERRORLEVEL auf einen Wert ungleich 0 gesetzt ist und Sie dann einen dieser Befehle ausführen, lautet das resultierende ERRORLEVEL wie folgt:

  • wird in einer .bat-Datei mit einem Wert ungleich 0 allein gelassen
  • zurücksetzen auf 0 in einer CMD-Datei.
418
Ben Hoffstein

Hier ist eine Zusammenstellung von überprüften Informationen aus den verschiedenen Antworten und zitierten Referenzen in diesem Thread:

  1. command.com ist der in MS-DOS eingeführte 16-Bit-Befehlsprozessor und wurde auch in der Win9x-Reihe von Betriebssystemen verwendet.
  2. cmd.exe ist der 32-Bit-Befehlsprozessor in Windows NT (64-Bit-Windows-Betriebssysteme haben auch eine 64-Bit-Version). cmd.exe war nie Teil von Windows 9x. Es entstand in OS/2, Version 1.0, und die OS/2-Version von cmd begann mit 16-Bit (war jedoch ein vollwertiges Programm für den geschützten Modus mit Befehlen wie start). Windows NT hat cmd von OS/2 geerbt, aber die Win32-Version von Windows NT wurde mit 32-Bit gestartet. Obwohl OS/2 1992 auf 32-Bit umgestellt wurde, blieb cmd ein 16-Bit-Programm für OS/2 1.x.
  3. Die Umgebungsvariable ComSpec definiert, welches Programm von den Skripten .bat und .cmd gestartet wird. (Ab WinNT ist dies standardmäßig cmd.exe.)
  4. cmd.exe ist abwärtskompatibel mit command.com.
  5. Ein Skript, das für cmd.exe entwickelt wurde, kann .cmd heißen, um eine versehentliche Ausführung unter Windows 9x zu verhindern. Diese Dateinamenerweiterung stammt auch aus OS/2, Version 1.0 und 1987.

Hier ist eine Liste von cmd.exe Funktionen, die von command.com nicht unterstützt werden:

  • Lange Dateinamen (die das 8.3-Format überschreiten)
  • Befehlsverlauf
  • Tab Vervollständigung
  • Escape-Zeichen: ^ (Verwendung für: \ & | > < ^)
  • Verzeichnisstapel: PUSHD/POPD
  • Ganzzahlige Arithmetik: SET /A i+=1
  • Suchen/Ersetzen/Teilzeichenfolge: SET %varname:expression%
  • Befehlsersetzung: FOR /F (existierte vorher, wurde erweitert)
  • Funktionen: CALL :label

Ausführungsreihenfolge:

Wenn sich beide Versionen (.bat und .cmd) eines Skripts (test.bat, test.cmd) im selben Ordner befinden und Sie das Skript ohne die Erweiterung (test) ausführen, wird standardmäßig sogar die .bat-Version des Skripts ausgeführt unter 64-Bit-Windows 7. Die Ausführungsreihenfolge wird von der Umgebungsvariablen PATHEXT gesteuert. Weitere Informationen finden Sie unter Reihenfolge, in der die Eingabeaufforderung Dateien ausführt .

Verweise:

wikipedia: Vergleich von Kommandoschalen

394
Chris Noe

Diese Antworten sind etwas zu lang und konzentrieren sich auf die interaktive Nutzung. Die wichtigen Unterschiede für die Skripterstellung sind:

  • .cmd verhindert die versehentliche Ausführung auf Nicht-NT-Systemen.
  • .cmd aktiviert integrierte Befehle, um die Fehlerstufe bei Erfolg auf 0 zu setzen.

Früher gab es auch eine Reihe zusätzlicher Funktionen, die in CMD-Dateien aktiviert waren. Befehlserweiterungen sind jedoch standardmäßig in BAT- und CMD-Dateien unter Windows 2000 oder höher aktiviert.

Fazit: Ab 2012 empfehle ich, ausschließlich .cmd zu verwenden.

65
Gringo Suave

Nein, das spielt keine Rolle. Unter NT bewirken die Erweiterungen .bat und .cmd, dass der Prozessor cmd.exe die Datei genauso verarbeitet.

Weitere interessante Informationen zu command.com vs. cmd.exe auf WinNT-Systemen von MS TechNet ( http://technet.Microsoft.com/en-us/library/cc723564.aspx ):

Dieses Verhalten zeigt eine sehr subtile Funktion von Windows NT, die sehr wichtig ist. Die 16-Bit-MS-DOS-Shell (COMMAND.COM), die im Lieferumfang von Windows NT enthalten ist, wurde speziell für Windows NT entwickelt. Wenn ein Befehl von dieser Shell zur Ausführung eingegeben wird, wird er tatsächlich nicht ausgeführt. Stattdessen wird der Befehlstext gepackt und zur Ausführung an eine 32-Bit-CMD.EXE-Befehlsshell gesendet. Da alle Befehle tatsächlich von CMD.EXE (der Windows NT-Befehlsshell) ausgeführt werden, erbt die 16-Bit-Shell alle Features und Funktionen der vollständigen Windows NT-Shell.

25
Michael Burr

RE: Offensichtlich ist das Aufrufen von command.com ein komplexes Rätsel.

Vor einigen Monaten mussten wir im Verlauf eines Projekts herausfinden, warum einige Programme, die wir unter CMD.EXE ausführen wollten, tatsächlich unter COMMAND.COM ausgeführt wurden. Bei dem "Programm" handelte es sich um eine sehr alte .BAT-Datei, die immer noch täglich ausgeführt wird.

Wir haben festgestellt, dass die Batch-Datei unter COMMAND.COM ausgeführt wurde, weil sie von einer PIF-Datei (ebenfalls uralt) gestartet wurde. Da die speziellen Speicherkonfigurationseinstellungen, die nur über ein PIF verfügbar sind, keine Rolle mehr spielen, haben wir sie durch eine herkömmliche Desktop-Verknüpfung ersetzt.

Dieselbe Stapelverarbeitungsdatei, die über die Verknüpfung gestartet wird, wird in CMD.EXE ausgeführt. Wenn Sie darüber nachdenken, ist dies sinnvoll. Der Grund, warum wir so lange gebraucht haben, um das herauszufinden, war teilweise die Tatsache, dass wir vergessen hatten, dass es sich bei dem Element in der Startgruppe um ein PIF handelte, da es seit 1998 in Produktion war.

15
David Gray

Da der ursprüngliche Beitrag die Konsequenzen der Verwendung von .bat oder .cmd Suffix betraf, müssen nicht unbedingt die Befehle innerhalb der Datei ...

Ein weiterer Unterschied zwischen .bat und .cmd besteht darin, dass, wenn zwei Dateien mit demselben Dateinamen und diesen beiden Erweiterungen existieren, dann:

  • wenn Sie Dateiname oder Dateiname. bat in die Befehlszeile eingeben, wird die .bat-Datei ausgeführt

  • um die .cmd-Datei auszuführen, müssen Sie Dateiname. cmd eingeben

13

Unter Windows 7 weisen BAT-Dateien jedoch auch den folgenden Unterschied auf: Wenn Sie jemals Dateien TEST.BAT und TEST.CMD im selben Verzeichnis erstellen und TEST in diesem Verzeichnis ausführen, wird die BAT-Datei ausgeführt.

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

alles, was in einem Stapel arbeitet, sollte in einem cmd funktionieren. cmd bietet einige Erweiterungen zum Steuern der Umgebung. Außerdem wird cmd von einem neuen cmd-Interpreter ausgeführt und sollte daher schneller (bei kurzen Dateien nicht erkennbar) und stabiler sein, da bat unter der mit NTVDM emulierten 16-Bit-Umgebung ausgeführt wird

8

Ich glaube, wenn Sie den Wert der Umgebungsvariablen ComSpec in %SystemRoot%system32\cmd.exe (CMD) ändern, spielt es keine Rolle, ob die Dateierweiterung .BAT oder .CMD ist. Ich bin nicht sicher, aber dies ist möglicherweise sogar die Standardeinstellung für WinXP und höher.

3
Patrick Cuff

Die Ausführung von .cmd- und .bat-Dateien ist unterschiedlich, da sie sich in einer .cmd-Fehlerebenenvariablen bei einem Befehl ändern kann, der von Befehlserweiterungen betroffen ist. Das ist es wirklich.

3
zask

Die Erweiterung macht keinen Unterschied.

Es gibt leichte Unterschiede zwischen der Behandlung der Datei durch COMMAND.COM und CMD.EXE.

1
Waldo

Etwas abseits des Themas, aber haben Sie Windows Scripting Host in Betracht gezogen? Vielleicht finden Sie es schöner.

1
Marcin