.BATファイル内で複数の.BATファイルを実行する方法


694

commit-build.batビルドプロセスの一部として他の.BATファイルを実行させようとしています。

内容commit-build.bat

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

これは非常に単純に見えcommit-build.batますが、リスト(msbuild.bat)の最初の項目のみを実行します。

問題なく各ファイルを個別に実行しました。


4
@sean-コマンドラインユーティリティを機能させるためにCygwinパッケージ全体をインストールする必要はありません。すべてのcygwin dllをパッケージから取り出して、パスされたディレクトリに配置し、すべてのツールを別のパスされたディレクトリに配置すれば、問題ありません。
Techie Joe 2013

これらのファイルのそれぞれがバッチであると仮定すると、なぜそれらを1つの大きなファイルに入れて、タイムアウト機能を使用して毎回開始できるようにするのではありません。
CMS_95 2014年

回答:


1199

使用する:

call msbuild.bat
call unit-tests.bat
call deploy.bat

CALLを使用しない場合、現在のバッチファイルは停止し、呼び出されたバッチファイルは実行を開始します。これは、初期のMS-DOS時代にさかのぼる独特の動作です。


奇妙なことに、私はWindows 7で「呼び出し」なしで試してみましたが、うまくいったことを覚えていますが、Windows XPではこのコマンドが必要でした。それは可能性が?
Android開発者

7
呼び出しなしでは、元のDOS仕様に従って、コマンドチェーンを実行して戻りません。「CALL」が追加される前の人気のあるオプションは、「command / c second.bat」などの子コマンドプロンプトを開くことでしたが、これも同様に返されます。
Brian Knoblauch 2013年

1
Windows 7の企業家に問題があったので、それはXPだけではありません
Rafiki

5
Windows 10では、最初の行のみが実行されます。しかしながら、ファーヒーンによる答えはうまくいきました。
ロブロ

2
パラメータをバッチファイルに渡す方法。パラメータの1つはスペースを含むパスです。
Zeus

179

他のすべての答えは正しいです:コールを使用してください。例えば:

 call "msbuild.bat"

歴史

従来のDOSバージョンでは、バッチファイルを再帰的に実行することはできませんでした。次に、別のcmdシェルを呼び出してバッチファイルを実行し、終了時に呼び出し元のcmdシェルに実行を戻すcallコマンドが導入されました。

明らかに、以降のバージョンでは、他のcmdシェルはもう必要ありません。

初期の頃、多くのバッチファイルは、バッチファイルを呼び出しても呼び出し元のバッチファイルに戻らないという事実に依存していました。追加の構文なしでその動作を変更すると、バッチメニューシステム(メニュー構造にバッチファイルを使用)などの多くのシステムが壊れます。

したがって、Microsoftの多くの場合と同様に、下位互換性がこの動作の理由です。

チップ

バッチファイルの名前にスペースが含まれている場合は、名前を引用符で囲みます。

call "unit tests.bat"

ちなみに、バッチファイルの名前がす​​べてわからない場合は、forを使用してこれを行うこともできます(バッチファイル呼び出しの正しい順序は保証されません。ファイルシステムの順序に従います)。

FOR %x IN (*.bat) DO call "%x"

呼び出し後にエラーレベルに対応することもできます。使用する:

exit /B 1   # Or any other integer value in 0..255

エラーレベルを返します。0は正しい実行を示します。呼び出しバッチファイルでは、次を使用して反応できます。

if errorlevel neq 0 <batch command>

if errorlevel 1NT4 / 2000 / XPより古いWindowsを使用している場合に使用して、すべてのエラーレベル1以上をキャッチします。

バッチファイルのフローを制御するために、goto :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

他の人が指摘したように:バッチファイルを置き換えるビルドシステムを確認してください。


同意したが、この場合、ループはファイルを間違った(アルファベット順?)順序で処理する可能性がある
Dave Archer

素敵で完全な答え。制御フローを含める場合は、gotoの代わりにcall:label1を使用してサブルーチンを実行でき、バッチファイルの 'return'ステートメントはわずかに奇妙なgoto:eofであることに注意してください(そして、デフォルトで存在するeofラベルを自分で作成します)。
レゴラス2018年

errorlevelコマンド例は、(CMDコンソールで)は、Windows 10上で、私に問題を与えました。コマンドを単にに変更しましたif errorlevel neq echo Houston We have a Problem!。私のバッチプロセスには問題がなく、ほぼ正常に完了しましたが、callステートメントの後にこのコマンドを使用する方法のすべてのステップで、「neqは現時点では予期されていませんでした」と表示されました。彼らは、等しくない構文が変更された可能性を考えて、私が試した!=とも<>なく、新しい構文のために同じ「現時点では期待できない」エラーを取得保管しました。私は何を間違っているのでしょうか?
TMWP

117

複数のコマンドプロンプトを開きたい場合は、

start cmd /k

/k:実行する必要があります。

多くのコマンドプロンプトを起動するには、次のようにします。

start cmd /k Call rc_hub.bat 4444

start cmd /k Call rc_grid1.bat 5555

start cmd /k Call rc_grid1.bat 6666

start cmd /k Call rc_grid1.bat 5570.

7
最初のアプリがコンソールをブロックするので、それが私たちが探していたものです。ヒントをありがとう
Michael Moeller

1
これにより、コマンドの複数のインスタンスが実行され、<pause>を持つ複数のバッチファイルを実行することもできます。+1これはまさに私が探していたソリューションです!
クリスチャンノエル

5
これらの数字が答えに含まれていることを説明していただけますか?彼らの目的は明確ではありません。
カラマルカキッド2017

3
ほとんどの人はstart "Window title" /wait cmd /k call something.bat、物事を順番に実行するために使用したいと思うでしょう。
Andrew

3
(またはstart "Window title" /wait cmd /c something.batcmd /c終了時にウィンドウを閉じる場所)
Andrew


28

プログラムをコンパイルするために複数のバッチを呼び出しています。エラーが発生した場合、私は当然のことと考えています
。1)バッチ内のプログラムはエラーレベルで終了します。
2)あなたはそれについて知りたいです。

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' 0より高いエラーレベルをテストします。このようにして、すべてのバッチが順番に呼び出されますが、エラーが発生すると停止し、画面にエラーメッセージが表示されます。


23

2つのバッチスクリプトaaa.batとbbb.batがあり、以下のように呼び出す場合

call aaa.bat
call bbb.bat

スクリプトを実行するとき、最初にaaa.batを呼び出し、aaa.batのスレッドが終了するのを待って、bbb.batを呼び出します。

ただし、aaa.batが終了してbbb.batが呼び出されるのを待ちたくない場合は、STARTコマンドを使用してみてください。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
  [parameters]

試験:

start /b aaa.bat
start /b bbb.bat


20

.batファイル内で.batファイルを呼び出すには、次を使用します。

call foo.bat

(はい、これはばかげfoo.batていますcall。コマンドプロンプトからのようにで呼び出すことができればより意味がありますが、正しい方法はを使用することです。)


7

ファイル名を見て、NAntやAnt(Javaバージョン)などのビルドツールの使用を検討しましたか。あなたはバットファイルよりもはるかに多くのコントロールを得るでしょう。


7

一度に多くのバッチファイルを開きたい場合は、callコマンドを使用できます。ただし、callコマンドは現在のbatファイルを閉じて別のbatファイルに移動します。一度に多くを開きたい場合は、これを試してみてください:

@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"

などなど、多くのファイルに対してcmdcall...」を繰り返します。これはWindows 7で機能しますが、他のシステムについてはわかりません。


6
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

それでも解決しない場合は、交換するstartとともにcallまたはこれを試してください。

Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat

3

callコマンドを使用するだけです!次に例を示します。

call msbuild.bat
call unit-tests.bat
call deploy.bat

3

正しい引用(これは時々トリッキーになることがあります):

start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""

1番目の引数-タイトル(この場合は空)
2番目の引数-/ Dは開始ディレクトリを指定し、現在の作業ディレクトリ(「%〜dp0」など)が必要な場合は省略できます
3番目の引数-起動するコマンド、「cmd.exe」
4番目arg-コマンド内の引数。コマンド内の引数は二重引用符で囲まれています(これにより、バッチ内の引用符内で引用符をエスケープします)


2

1つで複数のスクリプトを実行すると、同じ問題が発生しました。最初のスクリプトで終了していたことに気づかずに、最初のスクリプトで死ぬようにしました。

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT

11個すべてのスクリプトのEXIT行を削除して再試行しましたが、11個すべてが同じコマンドウィンドウで一度に1つずつ順番に実行されました。

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar

を削除せずexit、代わりに置き換えますgoto :eof。これはに「戻る」になるcall
シュテファン・

単純なバッチコマンドは、呼び出された順序で実行され、インデックスの基本的なレイアウトも実行されることに@echo off :menu some commands goto menu注意してください。これにより、閉じられるまで連続ループが実行されます。基本的に、::ジャストは必要ありません:
CMS_95

0

以下は私の問題を解決しました:

start call "batch1.bat"
start call "batch2.bat"

0

あなたはこれが欲しいかもしれません:

バッチスクリプトを並列で実行する

start "systemLogCollector" /min cmd /k call systemLogCollector.bat
start "uiLogCollector" /min cmd /k call uiLogCollector.bat
start "appLogCollector" /min cmd /k call appLogCollector.bat

ここでは、3つのバッチファイルが最小化された状態で個別のコマンドウィンドウで実行されます。それらを最小化したくない場合は、を削除し/minます。また、後でそれらを制御する必要がない場合は、タイトルを取り除くことができます。したがって、必要最小限のコマンドは、start cmd /k call systemLogCollector.bat


それらを終了したい場合

taskkill /FI "WindowTitle eq appLogCollector*" /T /F
taskkill /FI "WindowTitle eq uiLogCollector*" /T /F
taskkill /FI "WindowTitle eq systemLogCollector*" /T /F
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.