@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof
:loop
call :checkinstances
if %INSTANCES% LSS 5 (
rem just a dummy program that waits instead of doing useful stuff
rem but suffices for now
echo Starting processing instance for %1
start /min wait.exe 5 sec
goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping returns immediately;
rem otherwise just use an address that's unused and -n 1)
echo Waiting for instances to close ...
ping -n 2 ::1 >nul 2>&1
rem jump back to see whether we can spawn a new process now
goto loop
goto :eof
:checkinstances
rem this could probably be done better. But INSTANCES should contain the number of running instances afterwards.
for /f "usebackq" %%t in (`tasklist /fo csv /fi "imagename eq wait.exe"^|find /v /c ""`) do set INSTANCES=%%t
goto :eof
並行して実行され、最小化される最大4つの新しいプロセスを生成します。待機時間は、各プロセスの実行時間と実行時間に応じて、おそらく調整する必要があります。おそらく、何か他のことをしている場合は、タスクリストが探しているプロセス名を調整する必要もあります。
ただし、このバッチによって生成されたプロセスを適切にカウントする方法はありません。1つの方法は、バッチの開始時に乱数を作成し(%RANDOM%
)、処理を実行する(または処理プログラムを生成する)ヘルパーバッチを作成しますが、ウィンドウのタイトルをパラメーターに設定できます。
@echo off
title %1
"%2" "%3"
これは、最初のパラメーターにタイトルを設定し、3番目のパラメーターを引数として2番目のパラメーターを実行する単純なバッチです。次に、指定されたウィンドウタイトル(tasklist /fi "windowtitle eq ..."
)のプロセスのみを選択することにより、タスクリストでフィルタリングできます。これはかなり信頼性の高い方法で動作し、誤検出が多すぎないようにします。cmd.exe
まだいくつかのインスタンスが実行されている場合、ワーカープロセスのプールが制限されるため、検索は悪い考えです。
を使用%NUMBER_OF_PROCESSORS%
して、スポーンするインスタンス数の適切なデフォルトを作成できます。
これを簡単に適合させてpsexec
、リモートでプロセスを生成することもできます(ただし、他のマシンの管理者権限と、バッチでパスワードを提供する必要があるため、あまり実用的ではありません)。ただし、その場合はフィルタリングにプロセス名を使用する必要があります。