2017-05-03 5 views
0

複数のバッチファイルを呼び出すメインバッチファイルがあります。私はこれらのバッチファイルをすべて同時に実行できるようにしたい。それらがすべて完了すると、メインのマッチファイルで続行する必要があるプロセスがさらにあります。複数のバッチファイルを同時に実行し、プロセスが完了したかどうかを監視します

複数のバッチファイルを呼び出すために「開始」を使用すると、すべてのバッチファイルを同時にキックオフすることはできますが、それらは追跡できなくなります。 (メインバッチファイルは、他のバッチファイルを実行するとそのプロセスが完了したと考えます)。

「コール」を使用すると、バッチファイルプロセスを監視できますが、バッチファイルは同時に処理されるのではなく、順次実行されます。

方法はありますか?このPCでのアクセスを制限し、バッチのみを使用してこれを達成しようとしています。

メインバッチファイル

call first.bat 
call second.bat 
call third.bat 
:: echo only after all batch process done 
echo done! 

first.bat

timeout /t 10 

second.bat

timeout /t 10 

timeout /t 10 

答えて

2

これは、この問題を解決するための最も簡単で最も効率的な方法である:

この方法で
(
start first.bat 
start second.bat 
start third.bat 
) | pause 

echo done! 

メインファイルで待機している状態がを駆動イベントですので、任意のCPU時間を消費しません。pauseコマンドは、(block)のコマンドのいずれかが文字を出力したときに終了しますが、startコマンドは、このcmd.exeに出力を表示しません。このようにして、startコマンドによって開始されるすべてのプロセスが終了するまで、pauseはcharを待機し続けます。その時点で、(block)に関連付けられているパイプラインが閉じられているため、pause Stdinが閉じられ、コマンドはcmd.exeで終了します。

+0

ニース、私はこれについて(もう一度!)忘れました。このアプローチは私のコードと同じ問題を抱えていることに注意してください。ハンドルを継承し、バッチファイルが終了した後でも実行されているバッチファイルから開始されたものはパイプを開いたままにし、メインバッチファイルを一時停止します。 –

0
0 third.bat各呼ばれるバッチが最初に必要なプロセスが実行された後、それを削除し、その後、一時ディレクトリにファイルを作成し、あるバッチが

@ECHO OFF 
:: just delay for 5..14 seconds after creating a file "%1", then delete it and exit 
SETLOCAL 
ECHO.>"%~1" 
SET /a timeout=5+(%RANDOM% %% 10) 
timeout /t %timeout% >NUL 
DEL /F /Q "%~1" 
EXIT 

ように構成されている

tempディレクトリ名には通常セパレータが含まれているため、作成/削除するファイル名はバッチの最初のパラメータとして提供され、 "引用"されます。

メインラインは単に一時ディレクトリを作成してサブプロシージャを呼び出し、1秒間待機し、サブプロシージャのフラグファイルがすべて削除されているかどうかを確認します。彼らは、すべての手順で削除された場合にのみ、一時ディレクトリに

1

を削除していきこれは一時的なファイルを生成し、このリダイレクト内部バッチサブプロセスを開始し、それへのリダイレクトを作成することによって、それをロックします。すべてのサブプロセスが終了すると、リダイレクトが閉じられ、一時ファイルが削除されます。

サブプロセスが実行されているが、ファイルがロックされている、と私たちは、ファイルの名前を変更しようとすると、これをテストすることができます。我々は、ファイルの名前を変更することができた場合は、サブプロセスは他のプロセスのいくつかは、まだ実行されて、終了しています。

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for %%t in ("%temp%\%~nx0.%random%%random%%random%.tmp") do (

     echo Starting subprocesses 
     9> "%%~ft" (
      start "" cmd /c subprocess.bat 
      start "" cmd /c subprocess.bat 
      start "" cmd /c subprocess.bat 
      start "" cmd /c subprocess.bat 
      start "" cmd /c subprocess.bat 
     ) 

     echo Waiting for subprocesses to end 
     break | >nul 2>nul (
      for /l %%a in (0) do @(ren "%%~ft" "%%~nxt" && exit || ping -n 2 "") 
     ) 
     echo Done  

    ) & del "%%~ft" 

ノート:サブプロセス内で開始されたプロセスはまた、リダイレクトとロックを保持します。コードに何かが残っている場合、これは使用できません。

関連する問題