私が理解しているように、これ.bat
は古い16ビットの命名規則であり.cmd
、32ビットのWindows、つまりNTから始まります。しかし、私はどこにでも.batファイルを見続けており、どちらのサフィックスを使用してもまったく同じように機能するようです。私のコードは、NTよりも古いもので実行する必要はありませんと仮定すると、私は私のバッチファイルに名前を付けている方法は本当に問題でそれをしない、またはいくつかあります知っておかなけれ間違った接尾辞を使用して私を待っているの?
私が理解しているように、これ.bat
は古い16ビットの命名規則であり.cmd
、32ビットのWindows、つまりNTから始まります。しかし、私はどこにでも.batファイルを見続けており、どちらのサフィックスを使用してもまったく同じように機能するようです。私のコードは、NTよりも古いもので実行する必要はありませんと仮定すると、私は私のバッチファイルに名前を付けている方法は本当に問題でそれをしない、またはいくつかあります知っておかなけれ間違った接尾辞を使用して私を待っているの?
回答:
Mark Zbikowski自身によるこのニュースグループの投稿から:
CMD.EXEに関する限り、.CMDと.BATの違いは次のとおりです。拡張機能を有効にすると、エラーに関係なく、.CMDファイルのPATH / APPEND / PROMPT / SET / ASSOCがERRORLEVELを設定します。.BATは、エラーに対してのみERRORLEVELを設定します。
つまり、ERRORLEVELが0以外に設定されている場合に、これらのコマンドのいずれかを実行すると、結果のERRORLEVELは次のようになります。
set var=..
ステートメントを呼び出すときにエラーレベルを(再)設定しません。これは予想外の動作であると想定していたため、これは奇妙です。両方について議論することができます。.batファイルを使います。:-)
DPATH /?
まだAPPENDとしてリストされています。また、Wikiの記事は、DPATHがリストされていないことを除いて、ほとんどが修正されています。
以下は、このスレッド内のさまざまな回答と引用された参照から検証された情報をまとめたものです。
command.com
MS-DOSで導入された16ビットコマンドプロセッサで、Win9xシリーズのオペレーティングシステムでも使用されていました。cmd.exe
Windows NTの32ビットコマンドプロセッサです(64ビットWindows OSにも64ビットバージョンがあります)。cmd.exe
Windows 9xの一部ではありませんでした。これは、OS / 2バージョン1.0でcmd
始まり、OS / 2バージョンの16ビットが始まりました(ただし、のようなコマンドを備えた本格的なプロテクトモードプログラムstart
でした)。Windows NT cmd
はOS / 2から継承されましたが、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
ます。cmd.exe
に名前.cmd
を付けることができます。このファイル名拡張子は、OS / 2バージョン1.0および1987にも遡ります。でcmd.exe
サポートされていない機能のリストを次に示しますcommand.com
。
^
(のための使用:\ & | > < ^
)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環境変数によって制御されます。詳細については、コマンドプロンプトがファイルを実行する順序を参照してください。
参照:
ウィキペディア:コマンドシェルの比較
dir filename
と同じdir filename.*
です。ワイルドカードはcmd.exeで必要です。command.comでrem Create an empty file > empty.txt
動作します。cmd.exeにはありません。
これらの回答は少し長すぎて、インタラクティブな使用に重点を置いています。スクリプトの重要な違いは次のとおりです。
.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シェルのすべての機能と機能を継承します。
command /c ver
command.comの起動とverの入力を比較してください。
RE:どうやらcommand.comがいつ呼び出されるかは少し複雑な謎です。
数か月前、プロジェクトの過程で、CMD.EXEの下で実行したいプログラムが、実際にはCOMMAND.COMの下で実行されている理由を理解する必要がありました。問題の「プログラム」は非常に古い.BATファイルで、毎日実行されます。
バッチファイルがCOMMAND.COMの下で実行された理由は、それが.PIFファイル(これも古い)から開始されたことが原因であることがわかりました。PIFでのみ使用できる特別なメモリ構成設定は無関係になったため、従来のデスクトップショートカットに置き換えました。
ショートカットから起動された同じバッチファイルがCMD.EXEで実行されます。それについて考えるとき、これは理にかなっています。把握に時間がかかった理由の1つは、スタートアップグループの項目がPIFであることを忘れていたためです。
それでも、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>
PATHEXT
変数で.BAT拡張子が.CMD拡張子の前に配置されるために発生します(この回答に示されているように)。PATHEXTでこの順序を変更すると、代わりにtest.cmdが実行されます。
PATH
拡張子に関係なく、現在のディレクトリが環境変数内の他のディレクトリの前にあることにも注意してください。
元の投稿は.batまたは.cmd サフィックスを使用した結果に関するものだったので、必ずしもファイル内のコマンドではありません...
.batと.cmdのもう1つの違いは、同じファイル名と両方の拡張子を持つ2つのファイルが存在する場合、次のことです。
入力ファイル名やファイル名をコマンドラインでの.batは.BATファイルを実行します
.cmdファイルを実行するには、ファイル名 .cmd を入力する必要があります
PATHEXT
環境変数に依存します。拡張子が表示される順序は、拡張子が指定されていない場合の優先順位です。拡張子がenv変数に表示されるファイルの拡張子を指定する必要がないことにも言及する価値があります。
バッチで動作するものはすべてcmdで動作するはずです。cmdは、環境を制御するためのいくつかの拡張機能を提供します。また、cmdは新しいcmdインタープリタで実行されるため、NTVDMエミュレートされた16ビット環境でbatを実行すると、高速(短いファイルでは目立たない)で安定するはずです。
.bat
NTのDOSでは動作しません。VDMは、プログラムで必要な場合にのみ起動し、64ビットWindowsではサポートされていませんが、.batはそうです。
.cmdと.batファイルの実行は異なります。.cmderrorlevel変数では、コマンド拡張子の影響を受けるコマンドで変更される可能性があるためです。それは本当にそれについてです。
@echo off&setlocal ENABLEEXTENSIONS call :func&&echo/I'm a cmd||echo/I'm a bat goto :EOF :func md;2>nul set var=1
少し話題から外れましたが、Windows Scripting Hostを検討しましたか?あなたはそれがより良いかもしれません。
違い:
.cmdファイルは、実行される前にメモリにロードされます。.batファイルは行を実行し、次の行を読み取り、その行を実行します...
スクリプトファイルを実行するときにこれに遭遇し、実行が完了する前に編集できます。batファイルはこれによって混乱しますが、cmdファイルはそうしません。
echo 1&pause
それを実行するバッチファイルを作成します。あなたは見ます1
とPress any key to continue...
。一時停止中にecho 2&pause
、外部エディタで新しい行を追加します。キーを押す。あなたは見ます2
とPress any key to continue...
。echo 3&pause
最初から追加することもできます。その後、もう一度キーを押すと、が表示されます2
。