web-dev-qa-db-ja.com

別のウィンドウファイルまたはプロンプトからWindowsバッチファイルを呼び出すいくつかの方法。どちらの場合

Windowsバッチファイル(called.batまたはcalled.cmd)別のバッチファイルから呼び出すことができます(caller.batまたはcaller.cmd)またはインタラクティブなcmd.exeいくつかの方法でプロンプトを表示します。

  1. 直接呼び出し:called.bat
  2. 呼び出しコマンドを使用:call called.bat
  3. cmdコマンドを使用:cmd /c called.bat
  4. 開始コマンドを使用:start called.bat

ヘルプテキストに基づいて目的の使用法を区別するのは非常に困難です。例えば直接呼び出しの代わりに「呼び出し」コマンドを使用する理由。何が違うの?

さまざまな観点から、4つの可能性すべて(および欠落している場合は他の可能性)を分析する要約レポートに興味があります:適合するように設計された推奨ユースケース、プロセス生成、実行コンテキスト、環境、リターンコード処理。

注:Windows XP SP3を使用しています。

90
dim
  1. バッチファイルは、現在のcmd.exeインスタンス(または、エクスプローラーでダブルクリックした場合は新しいcmd.exeインスタンス)によって実行されます。

  2. #1と同じですが、バッチ/ cmdファイル内で使用した場合にのみ効果があります。 「呼び出し」のないバッチファイルでは、親バッチファイルが終了し、呼び出されたバッチファイルに制御が渡されます。 with 'call'は子バッチファイルを実行し、親バッチファイルは呼び出しに続くステートメントで続行します。

  3. 新しいcmd.exeインスタンスでバッチファイルを実行します。

  4. Startは、新しいウィンドウの新しいcmd.exeインスタンスでバッチファイルを実行し、呼び出し元は完了を待ちません。

97
Kyle Alons

ここのコメントから明らかでないこと:バッチファイルの名前(元の質問のケース#1)だけを使用して別のバッチファイルを呼び出す場合、呼び出し元のバッチファイルからstopsを実行します。たとえば、次の行では:

called.bat
echo Hello

「echo Hello」行(およびそれに続くもの)は呼び出されません。 「call」キーワードを使用すると、呼び出し後に実行が再開されます。したがって、この場合:

call called.bat
echo Hello

「echo Hello」行が呼び出されます。

さらに、called.batファイルに設定されているすべての変数も呼び出しプロセスに戻されます。

次の行を含む「called.bat」ファイルを想像してください。

set MYVAR=hello

次に、%MYVAR%を使用すると、呼び出し元のバッチファイルで使用可能になります。

call called.bat

しかし、それは使用しません

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.bat        
3
ken