звучит, как вы хотите используйте Powershell 2. Однако вы можете создать новые cmd
окна (или другие процессы) с помощью start
, см. также этот ответ. Хотя вы, вероятно, должны использовать некоторые другие инструменты и немного обман, чтобы создать что-то вроде«пул процессов» (только для из n экземпляров, запущенных за раз). Вы могли бы достичь последнего с помощью tasklist /im
и подсчета, сколько уже есть (for
цикл или wc
, , если это применимо) и просто ждать (ping -n 2 ::1 >nul 2>&1
) и повторно проверьте еще раз, можно ли породить новый процесс.
я сколотил небольшой тест партии для этого:
@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
возвращается немедленно; rem иначе просто используйте адрес, который не используется, и -n 1) echo Ожидание экземпляров для закрытия ... ping -n 2 :: 1> nul 2> rem прыжок назад, чтобы узнать, можем ли мы создать новый Сейчас процесс Гото петля Гото: ВФ
:checkinstances
rem this could probably be done better. But INSTANCES should contain
количество запущенных экземпляров впоследствии. для/ф «usebackq» %% т в (tasklist /fo csv /fi "imagename eq wait.exe"^|wc -l
) делать множество = %% Инстансы т Goto: ВФ
Это порождает максимум четыре новых процессов, которые выполняются параллельно и сведено к минимуму. Время ожидания должно быть скорректировано, вероятно, в зависимости от того, как многое делает каждый процесс и как долго он работает . Возможно, вам также понадобится настроить имя процесса, для которого tasklist выглядит, если вы делаете что-то еще.
Невозможно правильно подсчитать процессы, которые порождаются этим партиями. Один из способов будут создать случайное число в начале пакетных (%RANDOM%
) и создать вспомогательную партию, которая выполняет обработку (или нерестятся программа обработки), но , которая может установить ее заголовок окна для параметра :
@echo off
title %1
"%2" "%3"
Это было бы простая партия, которая устанавливает своего название к первому параметру и затем запускает второй параметр с третьим в качестве аргумента. Затем вы можете выбрать фильтр в списке задач, выбрав только процессов с указанным окном название (tasklist /fi "windowtitle eq ..."
). Это должно работать достаточно надежным и предотвращает слишком много ложных срабатываний . Поиск cmd.exe
был бы плохой идеей, если у вас все еще есть несколько экземпляров, так как это ограничивает ваш пул рабочих процессов.
Вы можете использовать %NUMBER_OF_PROCESSORS%
, чтобы создать разумное умолчание о том, как много экземпляров для появления.
Вы также можете легко адаптировать это использовать psexec
нереститься процессы удаленно (но не очень жизнеспособны , как вы должны иметь права администратора на другой машине, а также предоставить пароль в партия). Для фильтрации тогда вам придется использовать имена процессов .
Как всегда, я рекомендую Cygwin для всего. – LatinSuD