836

私が理解しているように、これ.batは古い 16 ビットの命名規則であり.cmd、32 ビット Windows、つまり NT から始まるものです。しかし、どこでも .bat ファイルを目にし続けており、どちらのサフィックスを使用してもまったく同じように動作するようです。自分のコードを NT より古いもので実行する必要がないと仮定すると、バッチ ファイルにどのような名前を付けるかは本当に重要なでしょうか?

4

12 に答える 12

509

Mark Zbikowski自身によるこのニュース グループの投稿から:

CMD.EXE に関する限り、.CMD と .BAT の違いは次のとおりです。.BAT は、エラーに対してのみ ERRORLEVEL を設定します。

つまり、ERRORLEVEL が 0 以外に設定されている場合、これらのコマンドのいずれかを実行すると、結果の ERRORLEVEL は次のようになります。

  • .bat ファイルで 0 以外の値のまま放置
  • .cmd ファイルで 0 にリセットします。
于 2008-09-29T14:41:55.700 に答える
450

これは、このスレッドでさまざまな回答と引用された参考文献から検証された情報をまとめたものです。

  1. command.comMS-DOS で導入された 16 ビット コマンド プロセッサであり、Win9x シリーズのオペレーティング システムでも使用されていました。
  2. cmd.exeWindows NT の 32 ビット コマンド プロセッサです (64 ビット Windows OS には 64 ビット バージョンもあります)。cmd.exeWindows 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 プログラムのままでした。
  3. ComSpecenv 変数は、スクリプトによって起動されるプログラムを定義します.bat.cmd(WinNT からは、これがデフォルトになりcmd.exeます。)
  4. cmd.exeと下位互換性がありcommand.comます。
  5. 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 環境変数によって制御されます。詳細については、コマンド プロンプトがファイルを実行する順序を参照してください。

参考文献:

ウィキペディア:コマンド シェルの比較

于 2008-09-29T18:03:44.077 に答える
135

これらの回答は少し長すぎて、インタラクティブな使用に焦点を当てています. スクリプトの重要な違いは次のとおりです。

  • .cmd非 NT システムでの不注意な実行を防ぎます。
  • .cmd組み込みコマンドが成功時に Errorlevel を 0 に変更できるようにします。

それほどエキサイティングではありませんよね?

以前は.cmd、コマンド拡張機能と呼ばれる、ファイルで有効になっている多くの追加機能がありました。ただし、 Windows 2000 以降では、.batとファイルの両方で既定で有効になっています。.cmd

結論: 2012 年以降は、単独で使用することをお勧めし.cmdます。

于 2012-08-17T18:13:01.143 に答える
24

いいえ、まったく問題ありません。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 シェルのすべての機能と機能を継承します。

于 2008-09-29T14:41:26.140 に答える
19

RE:どうやら、command.com がいつ呼び出されるかは、少し複雑な謎です。

数か月前、あるプロジェクトの過程で、CMD.EXE で実行したい一部のプログラムが、実際には COMMAND.COM で実行されている理由を突き止める必要がありました。問題の「プログラム」は非常に古い .BAT ファイルで、今でも毎日実行されています。

バッチ ファイルが COMMAND.COM の下で実行された理由は、バッチ ファイルが .PIF ファイル (これも古いファイル) から開始されたためであることがわかりました。PIF を介してのみ使用できる特別なメモリ構成設定は不要になったため、従来のデスクトップ ショートカットに置き換えました。

ショートカットから起動された同じバッチ ファイルは、CMD.EXE で実行されます。考えてみれば、これは理にかなっている。1998 年から生産されていたため、スタートアップ グループのアイテムが PIF であることを忘れていたことも原因の 1 つです。

于 2012-07-07T22:47:44.683 に答える
17

それでも、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>
于 2014-11-22T17:04:09.607 に答える
8

バッチで動作するものはすべて cmd で動作する必要があります。cmd は、環境を制御するためのいくつかの拡張機能を提供します。また、cmd は新しい cmd インタープリターで実行されるため、NTVDM エミュレートされた 16 ビット環境でバットが実行されるため、より高速で (短いファイルでは目立たない)、より安定するはずです。

于 2008-09-29T14:47:51.710 に答える
3

.cmd と .bat ファイルの実行は異なります。.cmd エラーレベル変数では、コマンド拡張子の影響を受けるコマンドで変更される可能性があるためです。それは本当にそれについてです。

于 2015-10-18T14:14:07.180 に答える
3

ComSpec 環境変数の値を%SystemRoot%system32\cmd.exe(CMD) に変更すれば、ファイル拡張子が であって.BAT.CMD. 確かではありませんが、これは WinXP 以降のデフォルトでさえあるかもしれません。

于 2008-09-29T17:40:39.000 に答える
1

拡張子は関係ありません。

ファイルのCOMMAND.COM処理とCMD.EXE.

于 2008-09-29T14:45:17.330 に答える
-10

違い:

.cmd ファイルは、実行される前にメモリにロードされます。.bat ファイルは、行を実行し、次の行を読み取り、その行を実行します...

これは、スクリプト ファイルを実行し、実行が完了する前に編集するときに発生する可能性があります。これにより、bat ファイルはめちゃくちゃになりますが、cmd ファイルはそうなりません。

于 2010-04-03T20:22:22.120 に答える