web-dev-qa-db-ja.com

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

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

commit-build.batの内容:

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

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

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

621
Th3Fix3r

つかいます:

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

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

1056

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

 call "msbuild.bat"

歴史

古いDOSバージョンでは、バッチファイルを再帰的に実行することは不可能でした。その後、バッチファイルを実行するために別のcmdシェルを呼び出し、終了したときに呼び出し元のcmdシェルに実行を返すcallコマンドが導入されました。

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

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

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

ヒント

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

call "unit tests.bat"

ところで:あなたがバッチファイルの名前をすべて持っていないなら、あなたはこれをするためにも使うことができます(それはバッチファイル呼び出しの正しい順序を保証するものではありません;それはファイルシステムの順序に従います):

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>

NT4/2000/XPよりも古いウィンドウがある場合はif errorlevel 1を使用して、すべてのエラーレベル1以上をキャッチします。

バッチファイルの流れを制御するには、goto :-(があります。

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

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

163

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

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.
101
farheen

試してください:

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

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

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

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

26
Jay
call msbuild.bat
call unit-tests.bat
call deploy.bat
21
butterchicken

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

call foo.bat

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

19
Zifre

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

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
17
user2314621

あなたのファイル名を見て、 NAnt またはAnt(Javaバージョン)のようなビルドツールを使うことを考えたことがありますか。あなたは、batファイルよりもはるかに多くのコントロールを手に入れるでしょう。

7
Dave Archer
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

それでもうまくいかない場合は、startcallに置き換えるか、次のようにします。

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

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

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

そして、それでも、または多くのファイルに対してstart cmd "call..."を繰り返します。これは Windows 7 で動作しますが、他のシステムについてはよくわかりません。

4
CMS_95

私は同じ問題を抱えていた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
2
John Oliphant

callコマンドを使用するだけです。これが一例です。

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

正しい引用で(これは時々注意が必要です):

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

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

1
robertcollier4

ここに私の方法=

cmd /c ""Path_Bat_Here.bat" %ARG%"
:: Or =
Call *.bat

ヘルプ= cmd /?

0
scientist_7