2

我正在尝试启动一个子进程,并将 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 才能重定向标准输入;有没有其他方法可以将标准输出定向到控制台窗口?

4

1 回答 1

2

只是不要重定向标准输出:

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

于 2013-03-21T12:29:15.567 回答