2013-09-26 33 views
0

我想运行几个程序由一个一个的,但有时我想保留自己的控制台窗口打开查看消息/错误运行外部进程,等待程序结束,获取exitcode并保持控制台打开?

是否有可能运行cmd.exe /K anotherProgram.exe,等到anotherProgram完成(WaitForExit())并获得另一个程序的exitCode?或者,也许我可以保持控制台以其他方式打开,而不是从cmd /K运行它?

+0

你的意思是说,让控制台窗口打开,以便用户可以读取输出? – Jodrell

+0

可以捕获控制台窗口的输出,因此您不需要保持打开状态。 – Koen

+0

是的,我想保持控制台窗口打开,因为我认为它需要更少的代码比捕获输出并将其呈现在某处。 – WRonX

回答

1

您可以捕获控制台程序的输出和errorstream得到消息/错误。 这样你也可以得到程序的退出代码。

看看在Process -class可用的事件:

Process.OutputDataReceived Event ==>用这个来捕获标准输出消息

Process.ErrorDataReceived Event ==>用这个来捕获错误消息

Process.Exited Event ==>用这个来获得退出代码

以下是关于格式化驱动器的例子(没有异常处理和参数测试)其中控制台窗口不可访问,并且输出和错误流被捕获并显示在消息框中。 退出代码也在退出过​​程时进行检查。

private Process formatProc; 

Private void DoFormat(string driveLetter) 
    this.formatProc = new Process 
    { 
     StartInfo = 
      { 
       UseShellExecute = false, 
       FileName = "format.com", 
       Arguments = string.Format("/FS:FAT {0}: /V: /Q", driveLetter), 
       RedirectStandardInput = true, 
       RedirectStandardOutput = true, 
       RedirectStandardError = true, 
       CreateNoWindow = true, 
       WindowStyle = ProcessWindowStyle.Hidden 
      }, 
     EnableRaisingEvents = true 
    }; 

    this.formatProc.OutputDataReceived += this.ProcOutputDataReceivedHandler; 
    this.formatProc.ErrorDataReceived += this.ProcErrorDataReceivedHandler; 
    this.formatProc.Exited += this.ProcExitedHandler; 

    this.formatProc.Start(); 
    this.formatProc.BeginOutputReadLine(); 
    this.formatProc.BeginErrorReadLine(); 
} 

private void ProcOutputDataReceivedHandler(object sendingProcess, DataReceivedEventArgs e) 
{ 
    if (string.IsNullOrEmpty(e.Data)) 
    { 
     MessageBox.Show(e.Data); 
    } 
} 

private void ProcErrorDataReceivedHandler(object sendingProcess, DataReceivedEventArgs e) 
{ 
    if (string.IsNullOrEmpty(e.Data)) 
    { 
     MessageBox.Show(e.Data); 
    } 
} 

private void ProcExitedHandler(object sender, EventArgs e) 
{ 
    var exitCode = this.formatProc.ExitCode; 
    var message = string.Empty; 
    switch (exitCode) 
    { 
     case 0: 
      message = "Format done."; 
      break; 
     case 1: 
      message = "Format failed. Incorrect parameters were supplied."; 
      break; 
     case 4: 
      message = "Format failed. A fatal error occurred."; 
      break; 
     case 5: 
      message = "Format ended by user."; 
      break; 
     default: 
      message = "Format failed. ExitCode = " + this.formatProc.ExitCode; 
      break; 
    } 

    this.formatProc.Dispose(); 
    MessageBox.Show(message); 
} 
+0

正如我在评论上面提到的,我不希望捕捉到输出,但我看到它是唯一的方法,所以我将其标记为一个答案。谢谢。 – WRonX