Hace un tiempo escribí un archivo por lotes que ejecuta solo un número máximo de comandos en Desbordamiento de pila: ejecución paralela de procesos de shell :
@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
Genera un máximo de cuatro procesos nuevos que se ejecutan en paralelo y minimizados. El tiempo de espera debe ajustarse probablemente, dependiendo de cuánto haga cada proceso y cuánto tiempo se esté ejecutando. Probablemente también necesite ajustar el nombre del proceso para el que se está buscando la lista de tareas si está haciendo otra cosa.
Sin embargo, no hay forma de contar correctamente los procesos generados por este lote. Una forma sería crear un número aleatorio al comienzo del lote ( %RANDOM%
) y crear un lote auxiliar que realice el procesamiento (o genere el programa de procesamiento) pero que pueda establecer el título de su ventana en un parámetro:
@echo off
title %1
"%2" "%3"
Este sería un lote simple que establece su título para el primer parámetro y luego ejecuta el segundo parámetro con el tercero como argumento. Luego puede filtrar en la lista de tareas seleccionando solo procesos con el título de ventana especificado ( tasklist /fi "windowtitle eq ..."
). Esto debería funcionar de manera bastante confiable y evita demasiados falsos positivos. Buscar cmd.exe
sería una mala idea si todavía tiene algunas instancias en ejecución, ya que eso limita su grupo de procesos de trabajo.
Puede usar %NUMBER_OF_PROCESSORS%
para crear un valor predeterminado razonable de cuántas instancias generar.
También puede adaptarlo fácilmente para usarlo psexec
para generar los procesos de forma remota (pero no sería muy viable ya que debe tener privilegios de administrador en la otra máquina y proporcionar la contraseña en el lote). Sin embargo, tendría que usar nombres de proceso para filtrar.