如何启动stdin重定向的进程,但不是stdout?

我正在尝试启动一个子进程,将stdin重定向到我自己创建的句柄,但是让stdout和stderr指向子进程的控制台窗口。

例:

var processStartInfo = new ProcessStartInfo(m_Exe) { UseShellExecute = false, RedirectStandardInput = true, }; m_Process = new Process {StartInfo = processStartInfo}; m_Process.Start(); m_StdIn = m_Process.StandardInput; // write a line to the subprocess m_StdIn.WriteLine(""); 

问题是设置RedirectStandardInput也会导致stdout和stderr被截获。 如果未设置RedirectStandardInput,则子进程的输出将正确发送到子进程的控制台窗口。

查看底层的win32 apis, http : //msdn.microsoft.com/en-gb/library/windows/desktop/ms686331%28v=vs.85%29.aspx说:

如果dwFlags指定STARTF_USESTDHANDLES,则此成员[hStdOutput]是进程的标准输出句柄。 否则,将忽略此成员,标准输出的缺省值是控制台窗口的缓冲区。

我们必须设置STARTF_USESTDHANDLES才能重定向stdin; 还有其他方法将stdout指向控制台窗口吗?

只是不重定向标准输出:

 static void Main(string[] args) { var psi = new ProcessStartInfo("cmd.exe") { RedirectStandardInput = true, RedirectStandardOutput = false, UseShellExecute = false }; var p = new Process { StartInfo = psi }; p.Start(); var stdin = p.StandardInput; // write a line to the subprocess p.StandardInput.WriteLine("dir"); } 

并且您的流程输出将显示在Console.Out上