как запустить несколько .cmd файлов параллельно - PullRequest
2 голосов
/ 25 августа 2010

У меня есть 4 .cmd файла.Я хочу работать параллельно, принимая 2 одновременно.скажем, мои файлы: 1.cmd, 2.cmd, 3.cmd, 4.cmd

Я хочу запустить 1.cmd и 2.cmd параллельно.Теперь, когда все это заканчивается, я хочу запустить 3.cmd, а затем 4.cmd.Короче говоря, в любой момент времени я хочу запустить 2 из .cmd файлов.

Я использую команду Start для параллельного выполнения.Но я новичок в написании сценариев, и меня смущает то, как создать упомянутый выше способ запуска cmd-файлов.

Любая помощь будет принята.

Ответы [ 2 ]

1 голос
/ 12 сентября 2010

Я дал ответ на «Параллельное выполнение процессов оболочки» один раз, цитируемое здесь:

Звучит так, как будто вы хотите использовать Powershell 2. Однако вы можетепорождайте новые cmd окна (или другие процессы) с помощью start, см. также этот ответ.Хотя вам, вероятно, придется использовать некоторые другие инструменты и небольшую хитрость, чтобы создать что-то вроде «пула процессов» (чтобы одновременно выполнялось не более n экземпляров).Вы можете достичь последнего, используя tasklist /im и подсчитав, сколько их уже существует (for loop или 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> & 1 rem отскок назад, чтобы увидеть, можем ли мы порождать новый процесс сейчас goto loop goto: eof

:checkinstances
rem this could probably be done better. But INSTANCES should contain

количество запущенных экземпляров впоследствии.for / f "usebackq" %% t в (tasklist /fo csv /fi "imagename eq wait.exe"^|wc -l) действительно установить INSTANCES = %% t goto: eof

Он порождает максимум четыре новых процесса, которые выполняются параллельно и свернуты.Время ожидания должно быть скорректировано, вероятно, в зависимости от того, сколько работает каждый процесс и как долго он выполняется.Вам, вероятно, также нужно настроить имя процесса, для которого ищет список задач, если вы делаете что-то еще.

Однако нет способа правильно подсчитать процессы, которые порождаются этим пакетом.Одним из способов может быть создание случайного числа в начале пакета (%RANDOM%) и создание вспомогательного пакета, который выполняет обработку (или порождает программу обработки), но который может установить в своем заголовке окна параметр:

@echo off
title %1
"%2" "%3"

Это будет простой пакет, который устанавливает в качестве заголовка первый параметр, а затем запускает второй параметр с третьим в качестве аргумента.Затем вы можете отфильтровать список задач, выбрав только процессы с указанным заголовком окна (tasklist /fi "windowtitle eq ...").Это должно работать достаточно надежно и предотвращать слишком много ложных срабатываний.Поиск cmd.exe был бы плохой идеей, если у вас все еще есть запущенные экземпляры, так как это ограничивает ваш пул рабочих процессов.

Вы можете использовать %NUMBER_OF_PROCESSORS% для создания разумного значения по умолчанию, сколько экземпляров порождать.

Вы также можете легко адаптировать это для использования psexec для удаленного запуска процессов (но это не очень жизнеспособно, так как вам нужно иметь права администратора на другом компьютере, а также ввести пароль впартия).Тогда вам придется использовать имена процессов для фильтрации.

0 голосов
/ 25 августа 2010

Я не пробовал это, но я предполагаю, что вы можете сделать это с PowerShell. Используйте этот тип структуры:

http://www.dougfinke.com/blog/index.php/2008/01/30/run-your-powershell-loops-in-parallel/

В этом примере вы сможете запускать файлы cmd / bat.

Проверьте следующие темы для некоторых идей (возможно, дублировать?)

Параллельное выполнение процессов оболочки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...