Frage

Wie ich es verstehe, ist .bat die alte 16-Bit-Namenskonvention und .cmd ist für 32-Bit-Windows, das heißt, mit NT starten. Aber ich weiterhin überall .bat-Dateien zu sehen, und sie scheinen genau die gleiche Arbeit entweder Suffix. Unter der Annahme, dass mein Code wird nie auf irgendetwas laufen müssen älter als NT, ist es wirklich wichtig, die Art, wie ich meine Batch-Dateien benennen, oder gibt es eine Gotcha wartet auf mich durch die falsche Suffix?

War es hilfreich?

Lösung

diese Newsgroup veröffentlicht von Mark Zbikowski selbst:

  

Die Unterschiede zwischen .CMD und .BAT bis cmd.exe betroffen   sind: Mit Erweiterungen aktiviert, PATH / APPEND / PROMPT / SET / ASSOC in .CMD   Dateien werden gesetzt Error-unabhängig von Fehlern. .BAT setzt Error-   nur auf Fehler.

Mit anderen Worten, wenn Error-zu Nicht-0 gesetzt und dann laufen Sie einen dieser Befehle wird das resultierende Error-sein:

  • allein gelassen an seinem nicht-0-Wert in einer BAT-Datei
  • auf 0 zurückgesetzt in einer .cmd-Datei.

Andere Tipps

Hier ist eine Zusammenstellung der verifizierten Informationen aus den verschiedenen Antworten und zitierten Referenzen in diesem Thema:

  1. command.com ist der 16-Bit-Befehlsprozessor in MS-DOS eingeführt und wurde auch in der Win9x Reihe von Betriebssystemen verwendet werden.
  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 16-Bit (war aber dennoch ein vollwertiger geschützten Modus Programm mit Befehlen wie start). Windows NT geerbt cmd von OS / 2, aber Windows NT Win32-Version begann 32-Bit. Obwohl OS / 2 gingen 32-Bit-1992 blieb seine cmd ein 16-Bit-OS / 2 1.x Programm.
  3. Die ComSpec env Variable definiert, welches Programm durch .bat und .cmd Skripte gestartet wird. (Beginnend mit WinNT wird standardmäßig cmd.exe.)
  4. cmd.exe ist rückwärtskompatibel mit command.com.
  5. Ein Skript, das für cmd.exe ausgelegt ist, kann .cmd benannt werden versehentliche Ausführung auf Windows 9x zu verhindern. Diese Dateierweiterung geht auf OS / 2-Version 1.0 und 1987 auch zurück.

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

  • Lange Dateinamen (über das 8.3-Format)
  • Befehl Geschichte
  • Tabulatorvervollständigung
  • Escape-Zeichen: ^ (Verwendung für: \ & | > < ^)
  • Verzeichnis-Stack: PUSHD / POPD
  • Integer-Arithmetik: SET /A i+=1
  • Suchen / Ersetzen / Substring: SET %varname:expression%
  • Befehl Substitution: FOR /F (vorher existiert, wurde erweitert)
  • Funktionen: CALL :label

Reihenfolge der Ausführung:

Wenn beide .bat und .cmd Versionen eines Skripts (test.bat, test.cmd) sind im selben Ordner und führen Sie das Skript ohne die Erweiterung (Test), wird standardmäßig die .bat Version des Skripts wird laufen, auch auf 64-Bit-Windows 7. die Reihenfolge der Ausführung von der PATHEXT Umgebungsvariable gesteuert wird. Siehe Reihenfolge, in der Eingabeaufforderung führt Dateien für weitere Details.

Referenzen:

wikipedia: Vergleich des Befehls-Shells

Diese Antworten sind ein bisschen zu lang und konzentrierte sich auf die interaktive Nutzung. Die wichtige Unterschiede für Scripting sind:

  • .cmd verhindert die unbeabsichtigte Ausführung auf Nicht-NT-Systemen.
  • .cmd ermöglicht integrierte Befehle Errorlevel auf 0 auf Erfolg zu ändern.

Befehlserweiterungen sind standardmäßig in beide .bat und .cmd-Dateien unter Windows 2000 oder höher.

Im Jahr 2012 und darüber hinaus empfehle ich .cmd ausschließlich.

Nein - es nicht im geringsten egal. Auf NT sowohl die .bat und .cmd Verlängerung bewirken, dass der Prozessor cmd.exe die Datei auf genau die gleiche Art und Weise verarbeiten.

Weitere interessante Informationen über command.com vs. cmd.exe auf WinNT-Klasse-Systeme von MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx ):

  

Dieses Verhalten zeigt eine recht subtile   Feature von Windows NT, die sehr   wichtig. Die 16-Bit-MS-DOS-Shell   (COMMAND.COM), die in Windows   NT ist speziell für Windows   NT. Wenn ein Befehl eingegeben für   Ausführung von dieser Schale, nicht wahr   führen Sie es tatsächlich. Stattdessen es   Pakete den Befehlstext und sendet sie   zu einem 32-Bit-Befehls-Shell für CMD.EXE   Ausführung. Da alle Befehle   tatsächlich ausgeführt durch cmd.exe (die   Windows NT-Befehls-Shell), der 16-Bit   Shell erbt alle Funktionen und   Einrichtungen des vollständigen Windows NT   Shell.

RE: Anscheinend wenn command.com aufgerufen wird, ist ein bisschen ein komplexes Geheimnis;

Vor einigen Monaten im Zuge eines Projekts mussten wir herausfinden, warum einige Programme, die wir unter cmd.exe waren in der Tat laufen wollte, unter COMMAND.COM ausgeführt wird. Das „Programm“ in Frage war eine sehr alte .BAT-Datei, die noch täglich ausgeführt wird.

Wir stellten fest, dass der Grund die Batch-Datei unter COMMAND.COM lief ist, dass es aus einer .PIF-Datei (auch alten) gestartet wurde. Da die speziellen Einstellungen sind nur über eine PIF verfügbaren Konfigurationsspeicher werden irrelevant, ersetzten wir es mit einem herkömmlichen Desktop-Verknüpfung.

Die gleiche Batch-Datei, aus der Verknüpfung gestartet, läuft in cmd.exe. Wenn man darüber nachdenkt, macht dies Sinn. Der Grund, dass es dauerte so lange es um herauszufinden, war zum Teil auf die Tatsache zurückzuführen, dass wir vergessen hatten, dass seine Artikel in der Startgruppe ein PIF waren, weil es seit 1998 in Produktion war.

Da der ursprüngliche Beitrag wurde in Bezug auf die Folgen der Verwendung der .bat oder .cmd Suffix , die nicht unbedingt die Befehle innen die Datei ...

Ein weiterer Unterschied zwischen .bat und .cmd ist, dass, wenn zwei Dateien vorhanden ist mit dem gleichen Dateinamen und diese beiden Erweiterungen, dann:

  • Eingabe von Dateinamen oder Dateiname .bat in der Befehlszeile wird die .bat-Datei ausführen

  • die .cmd-Datei ausführen können, müssen Sie eingeben Dateiname .cmd

Still, auf Windows 7, BAT-Dateien haben auch diesen Unterschied: Wenn Sie jemals Dateien TEST.BAT und test.cmd im gleichen Verzeichnis erstellen, und Sie laufen TEST in diesem Verzeichnis, es wird die BAT-Datei ausgeführt <. / p>

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>

alles in einem Batch arbeiten, soll in einem cmd arbeiten; cmd bietet einige Erweiterungen für die Umwelt zu kontrollieren. auch wird cmd in neuem cmd-Interpreter ausgeführt und somit soll (auf kurze Dateien nicht wahrnehmbar) schneller und stabiler als Fledermaus läuft unter dem NTVDM 16-Bit-Umgebung emuliert

Ich glaube, wenn Sie den Wert der Umgebungsvariable verweisen auf% SystemRoot% system32 \ cmd.exe ändern dann spielt es keine Rolle, ob die Dateierweiterung .bat oder .cmd ist. Ich bin nicht sicher, aber das kann auch der Standard für WinXP und oben.

Ein wenig off topic, aber haben Sie darüber nachgedacht, Windows Scripting Host ? Man könnte es schöner finden.

.cmd und .bat Datei Ausführung ist anders, weil in einem .cmd Errorlevel Variable kann es auf einem Befehl ändern, die von Befehlserweiterungen betroffen ist. Das ist es wirklich.

Die Erweiterung macht keinen Unterschied. Es gibt leichte Unterschiede zwischen COMMAND.COM Umgang mit der Datei vs. cmd.exe

Hier ist ein Unterschied, den ich entdeckt: EnableDelayedExpansion ist erforderlich in .cmd Dateien
. Wo, wie im Fall von .bat Dateien ist es implizit standardmäßig. ( Windows-10 )

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

Das funktioniert in .bat aber immer im Fall einer found Datei .cmd.
Ändern line 2 der folgenden macht es wie erwartet:

if %ERRORLEVEL% equ 0       (

Und schließlich für die .cmd Datei dies korrekt funktioniert:

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

ein Unterschied:

.cmd-Dateien werden in den Speicher geladen, bevor ausgeführt werden. .bat-Dateien eine Zeile, lesen Sie die nächste Zeile, führen Sie diese Zeile ausführen ...

Sie können über diese kommen, wenn Sie eine Skriptdatei ausführen und sie dann bearbeiten, bevor es die Ausführung fertig ist. bat-Dateien werden durch diese verkorkste, aber cmd-Dateien nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top