2010-01-18 3 views
2

Я использовал C# System.Diagnostics.Process для контроля вывода утилиты командной строки.System.Diaganostics.Process (когда один процесс внутренне использует другой)

Процесс, который я контролирую «внутренне», запускает второй процесс, и как только это произойдет, я не получаю никакого дополнительного результата от объекта процесса.

Что вызывает разочарование, если вы выполняете ту же самую команду (которую я запускаю с объектом System.Diagnostics.Process) с cmd.exe (вручную), консоль выводит каждую строку, которую мне нужно видеть в мое приложение C#!

Однако, если я (для целей тестирования) запустил cmd.exe с объектом System.Diagnostics.Process и запустил команду, он все равно останавливает вывод в той же точке, что и ранее (запуск process1.exe напрямую) ; в точке используется second.exe. Я думал, что этот тест будет консолидировать всю продукцию всех задействованных процессов, но это не так. Как я могу получить весь этот вывод в моем приложении C#?

ответ

5

Причина этого в том, что System.Diagnostics.Process буквально контролирует процесс, к которому он подключен.

Одним из способов обойти эту проблему было бы для первого приложения для вывода, когда он запускает второе приложение, и когда этот вывод будет получен, монитор из основного приложения для создания процесса из (теперь третьего) заявление. После запуска третьего приложения он должен появиться в массиве System.Diagnostics.Process.GetProcesses(), и затем вы можете прикрепить его к событию OutputDataReceived.

Ваш код будет выглядеть примерно так (непроверенный):

private void firstProcess_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e) 
{ 
    if (e.Data == "Starting next process") 
    { 
     System.Diagnostics.Process newProcess = null; 

     while (newProcess == null) 
     { 
      System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcesses(); 

      foreach (System.Diagnostics.Process proc in procs) 
      { 
       if (proc.ProcessName == "newProcess") 
       { 
        newProcess = proc; 
        break; 
       } 
      } 

      System.Threading.Thread.Sleep(100); 
     } 

     newProcess.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(newProcess_OutputDataReceived); 
    } 
} 

void newProcess_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e) 
{ 
    // Do something with your data received here. 
} 

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

EDIT: В противном случае, если вы не можете изменить исходный код для первого приложения, вы можете просто создать новый поток, который отслеживался таким образом (используя цикл while) постоянно и обрабатывать выходные данные третьего процесса в отдельный класс или просто перенастроить вывод из третьего процесса в обработчик для вывода второго процесса, чтобы у вас мог быть один метод обработки всего вывода для обоих процессов.

+0

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

+0

К сожалению, в структуре .Net не существует объекта, который так же хорош для «консолидатора процессов», как cmd.exe (при запуске вручную). –

+0

Я мог бы помочь: D –

1

Вам вообще нужно запускать cmd.exe? Не можете ли вы просто инициировать процесс для rsync непосредственно в своем Процессе, а затем использовать что-то вроде методов, описанных в this question, чтобы поймать результат выполнения команды, чтобы вы могли работать с ними в своем коде?

+0

Нет, я попробовал запустить cmd.exe вместо этого, потому что я надеялся, что он отобразит все выходные данные всех процессов. Сначала я попробовал это, как вы упоминаете, и выход (с использованием методов в вопросе, на который вы ссылались) прекратился после того, как первый процесс начал использовать второй процесс, который первый процесс вызывает внутри. –

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

  • Нет связанных вопросов^_^