2013-04-21 5 views
0

Я хочу запустить cmd-файл и сразу же получить результат.Перенаправление вывода процесса

Посмотрите на мой код. Заключение process.WaitForExit() не ждет; почему нет? copyf.cmd работает нормально, если я не запускаю его в скрытом режиме, потому что показанный dosbox работает до конца cmd. В скрытом режиме cmd закрыт, потому что process.WaitForExit() doen't wiat до завершения cmd.

public void doSomeThing( Queue<string> output, // queue for output log 
         Queue<string> error // queue for error log 
         ) 
{ 
      String com = "some params"; 

      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
      startInfo.FileName = Properties.Settings.Default.pathTo + @"\Make\copyf.cmd"; 
      startInfo.Arguments = com; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.RedirectStandardError = true; 
      startInfo.UseShellExecute = false; 
      startInfo.CreateNoWindow = true; 
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
      process.StartInfo = startInfo; 

      Thread thread = new Thread(new ThreadStart(() => 
      { 
       String er; 
       String outp; 

       while (true) 
       { 
        outp = process.StandardOutput.ReadLine(); 

        if(outp != null) 
         output.Enqueue("Output :" + outp + "\n"); 

        er = process.StandardError.ReadLine(); 
        if (er != null) 
         error.Enqueue("Error :" + er + "\n"); 
       } 
      })); 

      process.Start(); 
      thread.Start(); 
      process.WaitForExit(); 
} 
+0

Почему вы вычисляете 'WaitForExit' не ждать, пока процесс выхода? – Ryan

+0

Я нашел '.WaitForExit()' не работает cross threaded, вместо этого я полагаю, что использовал 'while (! Proc.HasExited)' (фигурировал скорее комментарий, чем ответ) – Sayse

+0

ну, его не перекрестная резьба , поток только считывает вывод/ошибку. «process» запускается в том же процессе, в котором обрабатывается process.WaitForExit (9). – tux007

ответ

0

Вы должны запустить консольный процессор команд «cmd.exe» с помощью C-переключателя вместо вызова файла .CMD.

/C переключатель будет поддерживать процесс cmd.exe, пока ваш командный файл не завершит выполнение. WaitForExit() будет ждать завершения CMD.exe. Я использовал его несколько раз. Для правильной работы WaitForExit он должен вызываться после StandardError.ReadToEnd(); в described here in msdn Модифицированная версия размещена ниже:

string command = string.Format("{0}\\Make\\copyf.cmd {1}", Properties.Settings.Default.pathTo , com); 
    int waitTime = 60000; //1 min as example here 
    using (var process = new Process() 
    { 
     StartInfo = new ProcessStartInfo() 
       { 
        UseShellExecute = false, 
        RedirectStandardOutput = true, 
        CreateNoWindow = true, 
        RedirectStandardInput = true, 
        RedirectStandardError = true, 
        FileName = "cmd.exe", 
        Arguments = string.Format("/C \"{0}\"", command) 
       } 
    }) 
    { 
     try 
     { 
      if (!process.Start()) 
      { 
       //Log some error "Failed to run command"; 
      } 
     } 
     catch (Exception ex) 
     { 
      //Log some error "Failed to start process command"; 
     } 

     process.BeginOutputReadLine(); 
     string error = process.StandardError.ReadToEnd(); 
     process.WaitForExit(waitTime); 
     if (!process.HasExited) 
     { 
      //Log something "Command: did not finish in time, terminating process" 
      try 
      { 
       process.Kill(); 
      } 
      catch { } 
     } 
    } 
+0

нет, не работает. – tux007

+0

Вы говорите, waitforexit не работает? или cmd.exe не работает? – loopedcode

+0

Добавлена ​​измененная версия, обратите внимание на вызов StandardError.ReadToEnd(), забыл поместить это в свой первый ответ. – loopedcode

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