@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
它最多产生四个并行执行并最小化的新进程。等待时间可能需要调整,具体取决于每个进程的工作量和运行时间。如果您要执行其他操作,则可能还需要调整任务列表正在查找的进程名称。
但是,无法正确计算此批处理产生的进程。一种方法是在批处理(%RANDOM%
)的开头创建一个随机数,并创建一个进行处理(或生成处理程序)但可以将其窗口标题设置为参数的助手批处理:
@echo off
title %1
"%2" "%3"
这将是一个简单的批处理,将其标题设置为第一个参数,然后运行第二个参数,第三个作为参数。然后,您可以通过仅选择具有指定窗口标题(tasklist /fi "windowtitle eq ..."
)的进程来过滤任务列表。这应该工作得相当可靠,并防止出现过多的误报。cmd.exe
如果仍然有一些实例在运行,搜索将不是一个好主意,因为这限制了工作进程的池。
您可以%NUMBER_OF_PROCESSORS%
用来创建合理的默认数量,以产生多少个实例。
您还可以轻松地对此进行修改以用于psexec
远程生成进程(但是这样做不可行,因为您必须在另一台计算机上具有管理员权限并在批处理中提供密码)。但是,您将不得不使用进程名称进行过滤。