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

1 回答 1

4

直接启动 SomeEXE

如果您直接启动 SomeEXE,而不是通过新的命令解释器,则通过将 stdout 重定向到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 示例显示异常处理非常差。如果抛出异常,它们将无法关闭示例中的流。处理流的最简单方法是将它们包装在using语句中。

如果 SomeEXE 产生一个子进程

如果您无法控制 SomeEXE 的代码,并且 SomeEXE 正在生成一个子进程,那么从孙控制台获取标准输入/标准输出的任务就更难了。但是,这是可以做到的。

您需要获取相关实际控制台窗口的进程 ID

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

于 2012-09-11T15:52:59.630 回答