@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 개의 새로운 프로세스를 생성합니다. 각 프로세스의 양과 실행 시간에 따라 대기 시간을 조정해야합니다. 다른 작업을 수행하는 경우 작업 목록을 찾고있는 프로세스 이름을 조정해야 할 수도 있습니다.
그러나이 배치에서 생성 된 프로세스를 올바르게 계산할 수있는 방법이 없습니다. 한 가지 방법은 일괄 처리 시작시 임의의 숫자를 만들고 ( %RANDOM%
) 처리를 수행하지만 처리 프로그램을 생성하지만 창 제목을 매개 변수로 설정할 수있는 도우미 일괄 처리를 만드는 것입니다.
@echo off
title %1
"%2" "%3"
제목을 첫 번째 매개 변수로 설정하고 두 번째 매개 변수를 인수로 사용하여 두 번째 매개 변수를 실행하는 간단한 배치입니다. 그런 다음 지정된 창 제목 ( tasklist /fi "windowtitle eq ..."
) 이있는 프로세스 만 선택하여 작업 목록을 필터링 할 수 있습니다 . 이것은 상당히 안정적으로 작동하고 너무 많은 오탐을 방지합니다. cmd.exe
작업자 프로세스 풀을 제한하기 때문에 일부 인스턴스가 계속 실행중인 경우 검색 하는 것은 좋지 않습니다.
%NUMBER_OF_PROCESSORS%
스폰 할 인스턴스 수의 합리적인 기본값을 만드는 데 사용할 수 있습니다 .
psexec
프로세스를 원격으로 생성하는 데 사용 하도록 쉽게 조정할 수도 있습니다 (그러나 다른 컴퓨터에 대한 관리자 권한이 있어야하고 배치에 암호를 제공해야하므로 실용적이지는 않습니다). 그러나 필터링을 위해 프로세스 이름을 사용해야합니다.