2016-08-16 2 views
-1

У меня есть специальное требование, когда я пытаюсь запустить дочерние bat-файлы из файла bat bat. Но есть несколько проблем, с которыми я сталкиваюсь.Как запустить несколько подчиненных пакетных файлов из основного пакетного файла?

  1. Мастер не ждет, пока ребенок завершит работу и завершит работу, не дожидаясь завершения дочернего файла. Это означает, что я не могу назначить его как работу.

  2. Когда я выполняю параллельное выполнение внутри основного файла, он не переходит к следующей строке выполнения.

Я добавляю код ссылки для вас.

Код для мастер-файла: -

start "C:\Test\Parallel_batch_process\chlidA.bat" 
start "C:\Test\Parallel_batch_process\chlidB.bat" 

childâ: -

start "test1" cmd.exe /C ^(ping server1 -n 2 ^> C:\Test\Parallel_batch_process\Test1.txt^) 
start "test2" cmd.exe /C ^(ping server2 -n 2 ^> C:\Test\Parallel_batch_process\Test2.txt^) 

ChildB: -

start "test1" cmd.exe /C ^(ping Server3 -n 5 ^> C:\Test\Parallel_batch_process\Test3.txt^) 
start "test2" cmd.exe /C ^(ping Server4 -n 2 ^> C:\Test\Parallel_batch_process\Test4.txt^) 

Существует еще один расширение это где я звоню внучат из файлы Child, но если это работает только, я могу перейти на следующий уровень.

+2

Непонятно, что вы просите. Вы хотите, чтобы хозяин ждал каждого дочернего элемента, но вы также хотите запустить их параллельно, вы не можете получить оба одновременно. – jeb

+0

'start 'C: \ Test \ Parallel_batch_process \ chlidA.bat" ' ' start' C: \ Test \ Parallel_batch_process \ chlidB.bat "' В этом случае «ребенок» неправильно указан неправильно. –

ответ

0

Если вы хотите выполнить пакетный файл из другой, вы должны использовать команду: CALL

REM Child.bat 
ECHO This is the child 

.

REM Master.bat 
ECHO This is the master 
CALL Child.bat 
CALL Child.bat 
+0

Спасибо, что он работал в определенной степени, пожалуйста, также дайте мне знать ответ на первую часть вопроса. Который требует, чтобы файл мастер-партии был активным, если ребенок не завершил свою обработку. Это выглядит как последовательное выполнение, как выполнить параллельное выполнение в этом случае. –

0

Я думаю, что, наконец, понял ваш вопрос - исправьте меня, если я ошибаюсь. Вы хотите:

  1. Запустить командный файл, который запускает несколько новых пакетных файлов, все запущенные одновременно;
  2. Однако этот командный файл не заканчивается, пока все начатые командные файлы не закончили.

Другими словами, вы хотите, чтобы JOIN выполнял запущенные процессы, ожидая их завершения, пока они сами не закончатся.

Да, вы не можете этого сделать. К сожалению, DOS (в котором начались командные файлы!) Не существует концепции параллельного выполнения. Итак, что вам нужно сделать, это запустить каждый из процессов самостоятельно, а затем использовать команду tasklist, чтобы узнать, все ли они работают (с Windows XP).

tasklist 

Это выводит данные в симпатичном формате, подходящем для отображения, но не для обработки! Давайте изменим формат, путем выбора значений, разделенных запятыми (CSV) версия:

tasklist /fo CSV 

Теперь мы говорим! Но все еще есть заголовки. Давайте удалим их:

tasklist /nh /fo CSV 

Хммм.OK, но ВСЕ перечислены процессы, которые запущены. Можем ли мы быть избирательными? Да, с помощью предложения if (пишется fi):

tasklist /nh /fo CSV /fi "imagename eq cmd.exe" 

Тест if проверяет имя запущенной программы. Вы не сказали нам об этом, поэтому я использовал cmd.exe - плохая идея! (Я предполагаю, что вы могли бы быть запущены собственные оболочки?) Обратите внимание, что существует целый ряд атрибутов - попробуйте windowname, если это помогает ...

Теперь мы можем сделать некоторые обработки! Вы можете узнать, сколько работаешь с использованием find «s -c варианта:

tasklist /nh /fo CSV /fi "imagename eq cmd.exe" | find /c "cmd" 

Но это не очень полезно для обработки. Итак:

for /f "usebackq" %%F in (`tasklist /nh /fo CSV /fi "imagename eq cmd.exe" ^| find /c "cmd"`) do set NUM=%%F 

Не забывайте: в командной строке, for использует один %. В пакетном файле, вам нужно два из них: %%
также: использовать экранирующий символ ^ для специальных символов оболочки ...

Так что теперь у вас есть число ваших процессов, запущенных в NUM переменная:

:Wait 
for /f "usebackq" ... (rest of line) 
if %NUM% NEQ 0 goto Wait 

... но это немного процессор интенсивно! Вероятно, вы должны немного подождать между двумя линиями:

:Wait 
for /f "usebackq" ... (rest of line above) 
if %NUM% EQU 0 goto Exit 
timeout 1 > nul 
goto Wait 
:Exit 
+0

Те, кто не работает в DOS, очевидно, что у них есть возможность работать параллельно. Windows cmd не DOS –

+0

@ LưuVĩnhPhúc Да, но я сказал, что пакетные файлы были _started_ в DOS, поэтому у него все еще есть многие из этих концепций, взвешивающих его. Нет концепции 'JOIN' ... –

+0

Думаю, теперь у меня есть ваша точка зрения. Вы имеете в виду историю партии из эпохи DOS, так что она имеет устаревшие проблемы. Я думал, вы имеете в виду, что вышеупомянутый командный файл вызывался из DOS –

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