2011-08-04 42 views
5

私は、他のバッチファイルを起動するWindowsバッチファイルを持っています。最初のバッチで何かを実行する前に、他のすべてのバッチファイルが終了するのを待つ方法はありますか?私は、他のコマンドを並行して実行する必要があるため、使用/待機できません。コマンドが完了するまで待つ

+0

あなたはいくつかのコードを投稿してもらえますか?あなたの問題が何であるかはわかりません。 – steenhulthin

+0

'call ...'を使って他のバッチを起動しますか? – woohoo

答えて

1

私の提案はCALLコマンドを使用することです。 Batch Filesから例:

Batch1.batリスト:

REM Batch1.bat 
SET ABC=1 
CALL BATCH2.BAT %ABC% 
ECHO ABC = %ABC% 
BATCH2.BAT %ABC% 
ECHO ABC = %ABC% 

Batch2.batリストは次のとおりです。

REM Batch2.bat 
SET ABC=%ABC%%1 


EDIT:ここ@Andriy M、からのフィードバックに基づいて、 2つのバッチの改善版です:

バッチ1:

@ECHO OFF 
REM Batch1.bat 
SET ABC=1 
CALL batch2.bat %ABC% 
ECHO 1. ABC = %ABC% 
CALL batch2.bat %ABC% REM test this line with CALL and without 
ECHO 2. ABC = %ABC% 

バッチ2:

@ECHO OFF 
REM Batch2.bat 
SET tmout=5 
echo sleeping %tmout% seconds... 
REM this introduces a timeout by using a nonexistent ip address 
PING 1.2.1.2 -n 1 -w %tmout%000 > NUL 
echo done sleeping 
SET ABC=%ABC%%1 

は、私がコメントテストにCALLとし、なく、この行を書いたbatch1内の行を参照してください。その行をCALLとし、CALLを付けずにそのバッチを2回実行します。

コンソールから出力CALLなし:

C:\temp>batch1.bat 
sleeping 5 seconds... 
done sleeping 
1. ABC = 11 
sleeping 5 seconds... 
done sleeping 

そして今CALLとコンソールからの出力:

C:\temp>batch1.bat 
sleeping 5 seconds... 
done sleeping 
1. ABC = 11 
sleeping 5 seconds... 
done sleeping 
2. ABC = 1111 

違いに注意してください:私たちは第二のエコーを取得し、q.e.d.

+1

つまり、CALLなしでは、CALLと同様に待ちますが、終了するのは...だけです。 :) –

+0

@Andriy M:これまでに経験したことに基づいて、それは**ではないので、CALLは実行されません - 呼び出しはバッチ/コマンドの終了を待たずにすぐに次の行に戻ります長い操作でそれを試してください)。 – woohoo

+0

それはとても独特なので、あなたのサンプルスクリプトを使って私の期待を検証しなければなりませんでした。私はWindows 7 SP1のコマンドプロンプトから最初のバッチを実行し、2つのスクリプトは私のために働いた。2回目に呼ばれたときに 'batch2.bat'が終了した後に実行が終了しました。つまり、 'batch1.bat'の最後の行は実行されませんでした。 CALLを使わないと実行が最初のバッチに戻り、待たずにいると言っていることで、何をテストしましたか? –

7

実行中のバッチファイルごとに1つずつ、複数のフラグファイルを使用できます。たとえば、次のように

同時バッチファイルの残りの部分を入力し、終了する前にそれを削除し、同じよう際に最初にバッチファイルがFlagfile.1を作成(Flagfile.2を、...)

メインファイルだけすべてのフラグファイルが消えるのを待たなければなりません。例えば、メインのファイルに:、

start Batch1 
start Batch2 
..... 
:wait 
if exist flagfile.* goto wait 

任意のバッチファイルで、たとえばBatch1:

echo %time% > flagfile.1 
echo Do my process... 
del flagfile.1 
exit 
+1

@woohoo:すみません、私はここに混乱があると思います。問題は、親のものを続ける前に、すべての子バッチが終了するのを待つ方法についてです。この問題をCALL経由で解決する方法はありませんが、STARTを使用して解決します。 質問者が言ったように、彼は/ WAITを使用できません。これはSTARTコマンドのオプションです。解決方法は、親Batchファイルがすべての子が終了する時を知ることを可能にするセマフォーシステムを実装することです。私は非常にシンプルなセマフォーシステムをファイルの存在に基づいて提案しましたが、それは完全に動作するはずです。 なぜ私の答えはdownvoteを受け取りましたか? :-( – Aacini

+1

+1、なぜこれが実際に質問に答える唯一の答えなので、実際に下の投票をしているのですか?メインファイルでフラグファイルを作成する方が良いでしょう。 – dbenham

+0

LOVE this!VSでは、各サービスプロジェクトのpost-buildイベントで 'CALL'を使用して、それぞれの* .cs参照ファイルをダウンロードして、単純なアセンブリ参照のすべてを含む別のプロジェクトに格納しました。 START/b/i'を実行して、同じウィンドウを開いて、同じウィンドウを開き、お互いに影響を与えることができないことを発見しました。プロジェクトを自動的に更新します。 –

関連する問題