我使用的代码如下:
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)会导致打开另一个包含实际结果的命令提示符,并等待回车符关闭。是否有可能获得此输出并发出回车?感谢。
答案 0 :(得分:4)
直接启动SomeEXE
如果直接启动SomeEXE,而不是通过新的命令解释器,通过将stdout重定向到 outputReader 来获取输出的现有代码将起作用。为此,请按以下方式更改代码:
startInfo.FileName = "SomeEXE";
startInfo.Arguments = "inputfile.txt";
您也可以将stdin重定向到您自己的流,以便您可以发出回车符:
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正在生成子进程,那么从孙子控制台获取stdin / stdout的任务就更难了。但是,它可以做到。
您需要obtain the process ID相关的实际控制台窗口。
然后,您可以使用Win32 API AttachConsole将孙子进程的控制台附加到您自己的。