2010-08-25 2 views
2

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

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

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

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

Благодаря Debjani

ответ

0

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

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

В этом примере вы должны быть в состоянии выполнить CMD/BAT файлы.

Заканчивать следующий поток для некоторых идей (? Можно дублировать)

Parallel execution of shell processes

+0

Как всегда, я рекомендую Cygwin для всего. – LatinSuD

1

Я дал ответ на “Parallel execution of shell processes” раз, цитируемый здесь:

звучит, как вы хотите используйте 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 нереститься процессы удаленно (но не очень жизнеспособны , как вы должны иметь права администратора на другой машине, а также предоставить пароль в партия). Для фильтрации тогда вам придется использовать имена процессов .

Смежные вопросы