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


14

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


これを行うと、データが破損する可能性があります!
サントシュクマール

8
@Santosh:「データに害を及ぼす可能性がある」とはどういう意味ですか?私の特定のケースでは、バックグラウンドタスクが独自の独立したデータセットを処理します。同時変更のリスクはありません。
セルジオ

1
Win32 API側からは、bWaitAll = TRUEを指定したWaitForMultipleObjectsが仕事をするだろうと思います 。満足のいく答えがなければ、入力ファイルで与えられたプログラムを分岐するだけのプログラムを書くのは難しくありません。
user1686

1
@grawity:はい、何も起こらないなら(そしてここにコードを投稿して)それをするつもりですが、車輪の再発明を避けることができるかどうか見てみましょう:)
Sergio

既存の車輪が正方形の場合、車輪の再発明は良いことです
...-user1686

回答:


10

以下の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!

これを以前に行ったことがあるので、このアプローチは見た目ほど難しくないことを伝えることができます。さらに、保守が簡単です-ロジックを拡張および追加し、他の誰かを保守するために簡単に訓練します。通常、これらのことは彼ら自身の命を奪います
...-RobW

このソリューションに満足しています。
user1068446

6

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

process1 | process2 | process3 | process4

これにより、4つのプロセスすべてが同時に実行され、すべて終了するまで戻りません。(考えられる例外:プロセスが明示的に標準出力を閉じた場合、あたかも終了したかのように扱われるかもしれません。しかし、それは珍しいことで、それを行うプロセスはほとんどありません。)

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


ええと、私が得るのは、すべてのプロセスが実際に一度に開始されることですが、process3はprocess4が完了するまで待機し続け、process2はprocess3が完了するまで待機し続けるということです。ちなみに、これは古典的なWindowsコマンドプロンプトからです。
セルジオ

@セルジオ:「待ち続ける」とはどういう意味ですか?
ハリージョンストン

1

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


0

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


これは、それらすべてが終了するのを待っていませんか?
タマラWijsman

それは確かにあなたがそれを書く方法に依存します。開始したジョブをポーリングして、完了したかどうかを確認し、完了したらスクリプトを終了できます。そのページのコードは、一度に3つのジョブのリスト全体を処理し、ジョブが終了するのを待ちます。
-uSlackr

うーん、Powershellでこれまで何もしなかった。サンプルを変更して任意のプロセスを実行し、それらが完了するのを待ってみました。約30分後、M $ technetで100回の検索を断念しました。誰かの気持ちを傷つけてすみませんが、Powershellはがらくたです。Cでこれを行う方が簡単です(これは言っていると思いますが...)とにかく、誰かがまだこれを便利だと思うでしょう。
セルジオ

Powershellにないことが1つあるとすればがらくたであり、使用しなくても私の気持ちを傷つけることはありません。ただし、30分間の検索では学習しません。
-uSlackr

1
PowerShellはくだらないものではなく、従来のshのような構文ではなく、習得しなければならない完全なプログラミング言語です。Perl、Python、Tcl、C#、および実際に使用せずに「lulz」を学習しようとした他のすべての言語についてまったく同じように感じていたことを覚えています。(しかし、実際それらを必要としたとき、それはかなり簡単に行きました。)
user1686

0

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

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


2
そのリンクの内容を要約してください。ページがダウンした場合、この回答は役に立ちません。
ケビンパンコ14年

遅すぎるようです。
ロバートマッサ

0

私も同様の仕事を探していました。目的は、複数のコマンドを並列に実行し、すべての並列プロセスの出力(標準出力とエラー)を抽出することでした。次に、すべての並列プロセスが終了するのを待って、別のコマンドを実行します。以下は、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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.