我试图用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 API,http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686331%28v=vs.85%29.aspx表示:
如果dwFlags指定STARTF_USESTDHANDLES,则此成员[hStdOutput]为
该过程的标准输出句柄。否则,此成员是
被忽略,标准输出的默认值是控制台窗口的
缓冲。
我们必须设置STARTF_USESTDHANDLES才能重定向标准输入;还有什么其他方法可以将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上
关于c# - 如何启动标准输入重定向而不是标准输出的进程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15547168/