私が理解しているように、これ.bat
は古い 16 ビットの命名規則であり.cmd
、32 ビット Windows、つまり NT から始まるものです。しかし、どこでも .bat ファイルを目にし続けており、どちらのサフィックスを使用してもまったく同じように動作するようです。自分のコードを NT より古いもので実行する必要がないと仮定すると、バッチ ファイルにどのような名前を付けるかは本当に重要なのでしょうか?
12 に答える
Mark Zbikowski自身によるこのニュース グループの投稿から:
CMD.EXE に関する限り、.CMD と .BAT の違いは次のとおりです。.BAT は、エラーに対してのみ ERRORLEVEL を設定します。
つまり、ERRORLEVEL が 0 以外に設定されている場合、これらのコマンドのいずれかを実行すると、結果の ERRORLEVEL は次のようになります。
- .bat ファイルで 0 以外の値のまま放置
- .cmd ファイルで 0 にリセットします。
これは、このスレッドでさまざまな回答と引用された参考文献から検証された情報をまとめたものです。
command.com
MS-DOS で導入された 16 ビット コマンド プロセッサであり、Win9x シリーズのオペレーティング システムでも使用されていました。cmd.exe
Windows NT の 32 ビット コマンド プロセッサです (64 ビット Windows OS には 64 ビット バージョンもあります)。cmd.exe
Windows 9x の一部ではありませんでした。これは OS/2 バージョン 1.0 で始まり、OS/2 バージョンのcmd
は 16 ビットで始まりました (ただし、 のようなコマンドを備えた本格的なプロテクト モード プログラムstart
でした)。Windows NT は OS/2 から継承cmd
されましたが、Windows NT の Win32 バージョンは 32 ビットから始まりました。OS/2 は 1992 年に 32 ビットになりましたcmd
が、16 ビットの OS/2 1.x プログラムのままでした。ComSpec
env 変数は、スクリプトによって起動されるプログラムを定義します.bat
。.cmd
(WinNT からは、これがデフォルトになりcmd.exe
ます。)cmd.exe
と下位互換性がありcommand.com
ます。- Windows 9x で誤って実行されないように設計されたスクリプト
cmd.exe
に名前を付けることができます。.cmd
このファイル拡張子も、OS/2 バージョン 1.0 および 1987 にさかのぼります。
cmd.exe
でサポートされていない機能の一覧を次に示しcommand.com
ます。
- 長いファイル名 (8.3 形式を超える)
- コマンド履歴
- タブ補完
- エスケープ文字:
^
(用途:\ & | > < ^
) - ディレクトリスタック:
PUSHD
/POPD
- 整数演算:
SET /A i+=1
- 検索/置換/部分文字列:
SET %varname:expression%
- コマンド置換:
FOR /F
(以前からあり、強化されています) - 機能:
CALL :label
実行順序:
スクリプトの .bat バージョンと .cmd バージョンの両方 (test.bat、test.cmd) が同じフォルダーにあり、拡張子を付けずにスクリプト (test) を実行すると、デフォルトではスクリプトの .bat バージョンが実行されます。 64 ビット Windows 7 の場合。実行の順序は PATHEXT 環境変数によって制御されます。詳細については、コマンド プロンプトがファイルを実行する順序を参照してください。
参考文献:
ウィキペディア:コマンド シェルの比較
これらの回答は少し長すぎて、インタラクティブな使用に焦点を当てています. スクリプトの重要な違いは次のとおりです。
.cmd
非 NT システムでの不注意な実行を防ぎます。.cmd
組み込みコマンドが成功時に Errorlevel を 0 に変更できるようにします。
それほどエキサイティングではありませんよね?
以前は.cmd
、コマンド拡張機能と呼ばれる、ファイルで有効になっている多くの追加機能がありました。ただし、 Windows 2000 以降では、.bat
とファイルの両方で既定で有効になっています。.cmd
結論: 2012 年以降は、単独で使用することをお勧めし.cmd
ます。
いいえ、まったく問題ありません。NT では、拡張子 .bat と .cmd の両方により、cmd.exe プロセッサがまったく同じ方法でファイルを処理します。
MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx )からの WinNT クラス システムでの command.com と cmd.exe に関する追加の興味深い情報:
この動作は、非常に重要な Windows NT の非常に微妙な機能を明らかにします。Windows NT に同梱されている 16 ビット MS-DOS シェル (COMMAND.COM) は、Windows NT 用に特別に設計されています。このシェルで実行するためにコマンドを入力しても、実際には実行されません。代わりに、コマンド テキストをパッケージ化し、実行のために 32 ビットの CMD.EXE コマンド シェルに送信します。すべてのコマンドは実際には CMD.EXE (Windows NT コマンド シェル) によって実行されるため、16 ビット シェルは完全な Windows NT シェルのすべての機能と機能を継承します。
RE:どうやら、command.com がいつ呼び出されるかは、少し複雑な謎です。
数か月前、あるプロジェクトの過程で、CMD.EXE で実行したい一部のプログラムが、実際には COMMAND.COM で実行されている理由を突き止める必要がありました。問題の「プログラム」は非常に古い .BAT ファイルで、今でも毎日実行されています。
バッチ ファイルが COMMAND.COM の下で実行された理由は、バッチ ファイルが .PIF ファイル (これも古いファイル) から開始されたためであることがわかりました。PIF を介してのみ使用できる特別なメモリ構成設定は不要になったため、従来のデスクトップ ショートカットに置き換えました。
ショートカットから起動された同じバッチ ファイルは、CMD.EXE で実行されます。考えてみれば、これは理にかなっている。1998 年から生産されていたため、スタートアップ グループのアイテムが PIF であることを忘れていたことも原因の 1 つです。
それでも、Windows 7 では、BAT ファイルにもこの違いがあります。ファイル TEST.BAT と TEST.CMD を同じディレクトリに作成し、そのディレクトリで TEST を実行すると、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>
バッチで動作するものはすべて cmd で動作する必要があります。cmd は、環境を制御するためのいくつかの拡張機能を提供します。また、cmd は新しい cmd インタープリターで実行されるため、NTVDM エミュレートされた 16 ビット環境でバットが実行されるため、より高速で (短いファイルでは目立たない)、より安定するはずです。
.cmd と .bat ファイルの実行は異なります。.cmd エラーレベル変数では、コマンド拡張子の影響を受けるコマンドで変更される可能性があるためです。それは本当にそれについてです。
ComSpec 環境変数の値を%SystemRoot%system32\cmd.exe
(CMD) に変更すれば、ファイル拡張子が であって.BAT
も.CMD
. 確かではありませんが、これは WinXP 以降のデフォルトでさえあるかもしれません。
拡張子は関係ありません。
ファイルのCOMMAND.COM
処理とCMD.EXE
.
違い:
.cmd ファイルは、実行される前にメモリにロードされます。.bat ファイルは、行を実行し、次の行を読み取り、その行を実行します...
これは、スクリプト ファイルを実行し、実行が完了する前に編集するときに発生する可能性があります。これにより、bat ファイルはめちゃくちゃになりますが、cmd ファイルはそうなりません。