2012-09-11 83 views
0

我使用这样的代码:命令打开一个命令提示符,

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 

startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "cmd.exe"; 
startInfo.Arguments = "/C SomeEXE inputfile.txt"; 
startInfo.UseShellExecute = false; 
startInfo.RedirectStandardOutput = true; 

process.StartInfo = startInfo; 
process.Start(); 

// Now use streams to capture the output 
StreamReader outputReader = process.StandardOutput; 

process.WaitForExit(); 

String line = outputReader.ReadToEnd(); 

这工作得很好。但是,发出的命令(SomeEXE)会导致打开另一个命令提示符,其中包含实际结果并等待回车被关闭。是否有可能获得此输出并发出回车?谢谢。

回答

4

启动SomeEXE直接

如果启动SomeEXE直接,而不是通过一个新的命令解释器,现有的代码通过标准输出重定向到outputReader将努力获得输出。要做到这一点,如下更改代码:

startInfo.FileName = "SomeEXE"; 
startInfo.Arguments = "inputfile.txt"; 

您可以重定向标准输入到自己的数据流,以及让你可以发出回车:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardinput.aspx

要点:

myProcess.StartInfo.RedirectStandardInput = true; 
StreamWriter myStreamWriter = myProcess.StandardInput; 

将Environment.NewLine写入myStreamWriter。

但是,由于您没有这样做,您正在捕获命令解释器的控制台。

如果你控制SomeEXE的代码

如果你有超过SomeEXE控制,可以指示它连接到其父的控制台:

http://www.csharp411.com/console-output-from-winforms-application/

注意,MSDN示例显示非常差异常处理。如果抛出异常,它们无法关闭示例中的流。处理流的最简单方法是使用语句将它们包装在中。

如果SomeEXE生成一个子进程

如果你有超过SomeEXE的代码无法控制,并且SomeEXE是生成一个子进程,抓住的标准输入/从孙子控制台标准输出的任务更难。但是,它可以完成。

您需要obtain the process ID有问题的实际控制台窗口。

然后,您可以使用Win32 API AttachConsole将孙级进程的控制台附加到您自己的控制台上。

+0

我没有获得输出 - 至少字符串是空的。 '派生命令提示符'包含输出数据。问题是我如何获得这些数据。 – cs0815

+1

哦,我明白了。给我一点时间来考虑这一点。 –

+0

仅供参考......你为什么要通过一个新的命令shell启动SomeEXE而不是直接作为process.Start()的目标? –