Saya telah menulis file batch yang hanya mengeksekusi jumlah maksimum perintah beberapa saat yang lalu di Stack Overflow: Eksekusi paralel dari proses 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
Ini memunculkan maksimal empat proses baru yang dieksekusi secara paralel dan diminimalkan. Waktu tunggu perlu disesuaikan mungkin, tergantung pada seberapa banyak setiap proses dan berapa lama itu berjalan. Anda mungkin juga perlu menyesuaikan nama proses yang dicari daftar tugas jika Anda melakukan sesuatu yang lain.
Meskipun demikian, tidak ada cara untuk menghitung dengan benar proses yang dihasilkan oleh kumpulan ini. Salah satu caranya adalah dengan membuat angka acak di awal batch ( %RANDOM%
) dan membuat batch pembantu yang melakukan pemrosesan (atau memunculkan program pemrosesan) tetapi yang dapat mengatur judul jendelanya menjadi parameter:
@echo off
title %1
"%2" "%3"
Ini akan menjadi kumpulan sederhana yang menetapkan judulnya ke parameter pertama dan kemudian menjalankan parameter kedua dengan argumen ketiga. Anda kemudian dapat memfilter dalam daftar tugas dengan memilih hanya proses dengan judul jendela yang ditentukan ( tasklist /fi "windowtitle eq ..."
). Ini harus bekerja dengan cukup andal dan mencegah terlalu banyak kesalahan positif. Mencari cmd.exe
akan menjadi ide yang buruk jika Anda masih memiliki beberapa contoh berjalan, karena membatasi kumpulan proses pekerja Anda.
Anda dapat menggunakan %NUMBER_OF_PROCESSORS%
untuk membuat default yang masuk akal dari berapa banyak instance untuk menelurkan.
Anda juga dapat dengan mudah mengadaptasi ini untuk digunakan psexec
untuk menelurkan proses jarak jauh (tetapi tidak akan sangat layak karena Anda harus memiliki hak admin di mesin lain serta memberikan kata sandi dalam batch). Namun, Anda harus menggunakan nama proses untuk memfilter.