Tôi đã viết một tệp bó chỉ thực hiện một số lượng lệnh tối đa một lúc trước trên Stack Overflow: Thực thi song song các quy trình 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
Nó sinh ra tối đa bốn quy trình mới thực hiện song song và giảm thiểu. Thời gian chờ có lẽ cần được điều chỉnh, tùy thuộc vào mỗi quá trình thực hiện và thời gian chạy. Có lẽ bạn cũng cần điều chỉnh tên quy trình mà danh sách tác vụ đang tìm nếu bạn đang làm gì đó.
Mặc dù vậy, không có cách nào để đếm đúng các quy trình được sinh ra bởi đợt này. Một cách là tạo một số ngẫu nhiên khi bắt đầu lô ( %RANDOM%
) và tạo một lô trợ giúp thực hiện xử lý (hoặc sinh ra chương trình xử lý) nhưng có thể đặt tiêu đề cửa sổ của nó thành một tham số:
@echo off
title %1
"%2" "%3"
Đây sẽ là một lô đơn giản đặt tiêu đề của nó thành tham số đầu tiên và sau đó chạy tham số thứ hai với tham số thứ ba làm đối số. Sau đó, bạn có thể lọc trong danh sách tác vụ bằng cách chỉ chọn các quy trình có tiêu đề cửa sổ được chỉ định ( tasklist /fi "windowtitle eq ..."
). Điều này sẽ hoạt động khá đáng tin cậy và ngăn ngừa quá nhiều tích cực sai. Tìm kiếm cmd.exe
sẽ là một ý tưởng tồi nếu bạn vẫn còn một số trường hợp đang chạy, vì điều đó giới hạn nhóm quy trình công nhân của bạn.
Bạn có thể sử dụng %NUMBER_OF_PROCESSORS%
để tạo một mặc định hợp lý về số lượng cá thể sinh sản.
Bạn cũng có thể dễ dàng điều chỉnh việc này để sử dụng psexec
để sinh ra các quy trình từ xa (nhưng sẽ không khả thi vì bạn phải có đặc quyền quản trị viên trên máy khác cũng như cung cấp mật khẩu theo đợt). Tuy nhiên, bạn sẽ phải sử dụng tên quy trình để lọc.