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


92

Windowsバッチファイル(called.batまたはcalled.cmd)は、いくつかの方法で別のバッチファイル(caller.batまたはcaller.cmd)または対話型のcmd.exeプロンプトから呼び出すことができます。

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

ヘルプテキストに基づいて意図された使用法を区別するのはかなり困っています。たとえば、直接呼び出しの代わりに「呼び出し」コマンドを使用する理由。何が違うの?

私は、さまざまな観点から4つの可能性すべて(および欠落している場合はその他)を分析するいくつかの要約レポートに興味があります。

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

回答:


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

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

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

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


7
オプション4については、開始コマンドの後には常に「タイトル」が続く必要があるため、タイトルが必要ない場合は、二重引用符を空にする必要があります。例:start "" [options] command
Daryn

このリンクの@Darynは、常に1つあるべきだと述べているだけですが、Microsoftはパラメーターをオプションとして説明しているとさえ言っています。彼らはなぜそれが「必要」である必要があるのか​​私に教えてくれません。下部のいくつかの例でさえ、titleパラメータを省略しています。
Adam Plocher、2016

5

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

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        
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.