私たちのビルドプロセスの一部として、私のcommit-build.bat
に他の.BATファイルを実行させようとしています。
commit-build.bat
の内容:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
これは十分に単純に思えますが、commit-build.bat
はリストの最初の項目(msbuild.bat
)のみを実行します。
私は問題なく各ファイルを別々に実行しました。
つかいます:
call msbuild.bat
call unit-tests.bat
call deploy.bat
CALLを使用しない場合、現在のバッチファイルは停止し、呼び出されたバッチファイルは実行を開始します。これは、MS-DOSの初期の頃にさかのぼる独特の動作です。
他のすべての答えは正しいです:コールを使用してください。例えば:
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
...
他の人が指摘したように:バッチファイルを置き換えるためのビルドシステムを見てください。
複数のコマンドプロンプトを開きたい場合は、
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.
試してください:
call msbuild.bat
call unit-tests.bat
call deploy.bat
プログラムをコンパイルするために複数のバッチを呼び出しています。私は当然のことながら、エラーが発生した場合:
1)バッチ内のプログラムはエラーレベルで終了します。
2)あなたはそれについて知りたいのです。
for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1
'||' 0以上のエラーレベルをテストします。このようにしてすべてのバッチが順番に呼び出されますが、エラーが発生すると画面が表示されたままになり、エラーが発生すると停止します。
call msbuild.bat
call unit-tests.bat
call deploy.bat
.bat
ファイル内で.bat
ファイルを呼び出すには、次のようにします。
call foo.bat
(はい、これはばかげています。コマンドPromptから呼び出すことができるように、foo.bat
で呼び出すことができれば意味がありますが、正しい方法はcall
を使用することです。)
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
あなたのファイル名を見て、 NAnt またはAnt(Javaバージョン)のようなビルドツールを使うことを考えたことがありますか。あなたは、batファイルよりもはるかに多くのコントロールを手に入れるでしょう。
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
一度に多数のバッチファイルを開きたい場合は、callコマンドを使用できます。ただし、callコマンドは現在のbatファイルを閉じて別のファイルに移動します。一度にたくさん開くには、これを試してみてください。
@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"
そして、それでも、または多くのファイルに対してstart cmd
"call
..."を繰り返します。これは Windows 7 で動作しますが、他のシステムについてはよくわかりません。
私は同じ問題を抱えていた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
call
コマンドを使用するだけです。これが一例です。
call msbuild.bat
call unit-tests.bat
call deploy.bat
正しい引用で(これは時々注意が必要です):
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の引数。その中の引数には二重引用符が使用されます(これは、引用符内の引用符をバッチでエスケープする方法です)。
ここに私の方法=
cmd /c ""Path_Bat_Here.bat" %ARG%"
:: Or =
Call *.bat
ヘルプ= cmd /?