web-dev-qa-db-ja.com

Windowsバッチファイル:.bat vs .cmd?

私が理解しているように、.batは古い16ビットの命名規則であり、.cmdは32ビットWindowsのためのもので、つまりNTから始まります。しかし、私はどこでも.batファイルを見続けています、そしてそれらはどちらの接尾辞を使っても全く同じように働くようです。私のコードがNTよりも古いもので実行する必要が決してないと仮定すると、それは私が私のバッチファイルにどのような名前をつけるか、あるいは間違った接尾辞を使って私を待っているgotchaが本当にありますか?

682
Chris Noe

から このニュースグループの投稿 / Mark Zbikowski 彼自身:

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

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

  • .batファイルで0以外の値のままにしておく
  • .cmdファイルで0にリセットします。
410
Ben Hoffstein

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

  1. command.comはMS-DOSで導入された16ビットコマンドプロセッサで、Win9xシリーズのオペレーティングシステムでも使用されていました。
  2. cmd.exeは、Windows NTの32ビットコマンドプロセッサです(64ビットWindows OSにも64ビットバージョンがあります)。 cmd.exeはWindows 9xの一部ではありませんでした。それはOS/2バージョン1.0で始まりました、そして、cmdのOS/2バージョンは16ビットを始めました(それにもかかわらずstartのようなコマンドで完全に保護された保護モードプログラムでした)。 Windows NTはOS/2からcmdを継承しましたが、Windows NTのWin32バージョンは32ビットから始まりました。 OS/2は1992年に32ビットになりましたが、そのcmdは16ビットOS/2 1.xプログラムのままでした。
  3. ComSpec env変数は、どのプログラムが.batおよび.cmdスクリプトによって起動されるかを定義します。 (WinNT以降では、これはデフォルトでcmd.exeです。)
  4. cmd.execommand.comと下位互換性があります。
  5. cmd.exe用に設計されたスクリプトは、Windows 9x上での誤った実行を防ぐために.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環境変数によって制御されます。 コマンドプロンプトがファイルを実行する順序 を参照してください。

参考文献:

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

386
Chris Noe

これらの答えは少し長すぎて対話的な使用に焦点を合わせています。スクリプトの重要な違いは次のとおりです。

  • .cmdは、NT以外のシステムでの誤った実行を防ぎます。
  • .cmdは、組み込みコマンドが成功時にErrorlevelを0に変更できるようにします。

コマンド拡張は、Windows 2000以降の.batファイルと.cmdファイルの両方でデフォルトでオンになっています。

2012年以降は、.cmdのみを使用することをお勧めします。

59
Gringo Suave

いいえ - それは少しでも問題ではありません。 NTでは、拡張子.batと.cmdの両方で、cmd.exeプロセッサはファイルをまったく同じ方法で処理します。

MS TechNet( http://technet.Microsoft.com/ja-jp/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シェルのすべての機能と機能を継承します。

24
Michael Burr

RE: / command.comが起動されるのは明らかに少し複雑な謎です。

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

バッチファイルがCOMMAND.COMの下で実行されている理由は、.PIFファイルから開始されているためです(これも古くなっています)。 PIFを介してのみ利用可能な特別なメモリ構成設定は無関係になったので、我々は従来のデスクトップショートカットでそれを置き換えました。

ショートカットから起動された同じバッチファイルがCMD.EXEで実行されます。あなたがそれについて考えるとき、これは理にかなっています。それを理解するのにそれほど時間がかかった理由は、1998年以来生産されていたので、スタートアップグループのそのアイテムがPIFであることを忘れていたという事実に部分的に起因していました。

15
David Gray

元の記事では、.batまたは.cmd サフィックス を使用した場合の影響について説明していたため、必ずしもコマンド inside the ...を使用する必要はありません...

.batと.cmdのもう1つの違いは、同じファイル名とその両方の拡張子を持つ2つのファイルが存在する場合、

  • コマンドラインで filename または filename 。batと入力すると、.batファイルが実行されます。

  • .cmdファイルを実行するには、 filename 。cmdと入力する必要があります。

13

それでも、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>
11
tvCa

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

8

ちょっと話題を離れていますが、 Windows Scripting Host /を検討しましたか?あなたはそれがより良いと思うかもしれません。

3
Marcin

ComSpec環境変数の値を%SystemRoot%system32\cmd.exeに変更しても、ファイル拡張子が.BATか.CMDかは関係ありません。よくわかりませんが、これはWinXP以降のデフォルトの場合もあります。

3
Patrick Cuff

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

3
zask

拡張子は違いはありません。ファイルを処理するCOMMAND.COMとCMD.EXEの間にはわずかな違いがあります。

2
Waldo