@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
เพื่อวางไข่กระบวนการจากระยะไกล (แต่จะไม่ทำงานได้มากเพราะคุณต้องมีสิทธิ์ผู้ดูแลระบบในเครื่องอื่น ๆ เช่นเดียวกับรหัสผ่านในแบทช์) คุณจะต้องใช้ชื่อกระบวนการสำหรับการกรองแล้ว