web-dev-qa-db-ja.com

Windowsで、複数の同時バックグラウンドプロセスを実行し、それらがすべて終了するのを待つ

それを実行するcmdスクリプト、および/またはジョブの準備ができているコマンドラインツールがあるかどうか誰でも知っていますか?

14
Sergio

以下の3つのバッチファイルを作成します。 Main.batは1.batおよび2.batを起動します

1.batおよび2.batは、main.batがチェックする一時ファイルを書き出します。 1.batおよび2.batが機能している間、main.batは処理がまだ行われていることを報告します。 1.batまたは2.batの開いているウィンドウでEnterキーを押すと、一時ファイルが削除され、プログラムが終了します。これは、その.batファイルの処理停止をシミュレートします。 1と2.batの両方に対してこれを行うと、main.batは、これらのプロセスの処理が完了したことを報告します。終了時に一時ファイルをクリアする限り、1.batと2.batに任意の処理を実行できます。この時点で、main.batは、やりたいことをすべて実行できます。

1.bat

echo %time% > 1.tmp
pause
del 1.tmp
exit 

2.bat

echo %time% > 2.tmp
pause
del 2.tmp
exit

main.bat

@echo off
start "1" 1.bat
start "2" 2.bat
    @ping -n 1 127.0.0.1 > nul
:loop
@echo Processing......
if not exist *.tmp goto :next
    @ping -n 5 127.0.0.1 > nul
goto loop
:next
@echo Done Processing!
10
RobW

プロセスが標準入力または標準出力を必要としない場合は、十分に単純です。コマンドラインから、またはバッチファイルで:

process1 | process2 | process3 | process4

これは、4つのプロセスすべてを同時に実行し、すべて終了するまで戻りません。 (例外の可能性:プロセスが明示的に標準出力を閉じた場合、それが終了したかのように処理される可能性があります。しかし、それは珍しいことであり、非常に少数のプロセスがそれを行います。)

この方法で同時に起動できるプロセスの数は正確にはわかりません。私は10個まで試しました。

6
Harry Johnston

これを行う唯一の方法は、個別のバッチファイルを開始することです(start /?)個々のタスクを実行し、完了時にテキストファイルを書き込みます。次に、テキストファイルが作成されているかどうかを定期的に確認します。

1
Tamara Wijsman

Powershell Start-Jobコマンドレットを見てください。これを行うことができるはずです。詳細 ここ Powershellは、Microsoftが選んだシェルです。それはcmdスクリプトよりもはるかに強力であり、あなたの時間の投資に値する

0
uSlackr

私も同様の仕事を探していました。目的は、複数のコマンドを並列に実行し、すべての並列プロセスの出力(stdoutとエラー)を抽出することでした。次に、すべての並列プロセスが終了するのを待って、別のコマンドを実行します。以下は、CMDで実行できるBATファイルのサンプルコードです。

( start "" /B cmd /c ping localhost -n 6 ^>nul timeout /t 5 /nobreak start "" /B /D "C:\users\username\Desktop" cmd /c dir ^> dr.txt ^2^>^&^1 start "" /B cmd /c ping localhost -n 11 ^>nul timeout /t 10 /nobreak ) | pause Echo waited timeout /t 12 /nobreak

()内のすべてのステートメントが最初に実行され、それらが完了するのを待ってから、最後の2行が実行されます。 startで始まるすべてのコマンドは同時に実行されます。

これらのリンクは役に立ちます: https://stackoverflow.com/a/43762349/9689416 および https://ss64.com/nt/start.html

0
Vivek Atal

または、これを使用できます: http://www.out-web.net/?p=167

私はそれを行いました、それは機能しますが、完成したプロセスのPIDが開始したばかりの別のWindowsプロセスによってすぐに再利用され、プロセスの終了の検出が危険/誤っている場合があります。

0
OlivierR