Windows-Batch-Dateien: .bat vs .cmd?
-
02-07-2019 - |
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?
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:
-
command.com
ist der 16-Bit-Befehlsprozessor in MS-DOS eingeführt und wurde auch in der Win9x Reihe von Betriebssystemen verwendet werden. -
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 voncmd
begann 16-Bit (war aber dennoch ein vollwertiger geschützten Modus Programm mit Befehlen wiestart
). Windows NT geerbtcmd
von OS / 2, aber Windows NT Win32-Version begann 32-Bit. Obwohl OS / 2 gingen 32-Bit-1992 blieb seinecmd
ein 16-Bit-OS / 2 1.x Programm. - Die
ComSpec
env Variable definiert, welches Programm durch.bat
und.cmd
Skripte gestartet wird. (Beginnend mit WinNT wird standardmäßigcmd.exe
.) -
cmd.exe
ist rückwärtskompatibel mitcommand.com
. - 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.