通过C#发出的命令打开另一个命令提示符

时间:2012-09-11 15:48:47

标签: c# .net

我使用的代码如下:

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)会导致打开另一个包含实际结果的命令提示符,并等待回车符关闭。是否有可能获得此输出并发出回车?感谢。

1 个答案:

答案 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将孙子进程的控制台附加到您自己的。