【问题标题】:How can I start a process with stdin redirected, but not stdout?如何使用重定向标准输入而不是标准输出来启动进程?
【发布时间】:2013-03-21 12:11:23
【问题描述】:

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

【问题讨论】:

    标签: c# winapi


    【解决方案1】:

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

    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 上

    【讨论】:

    • 也许我应该更清楚一点:我的主进程不是控制台应用程序;当我启动子进程时,它会打开自己的控制台缓冲区,但如果您设置 RedirectStandardInput,输出会被吞没(或者更确切地说,写入主进程的标准输出,在我的情况下是无效的)。我希望子进程的输出转到弹出的控制台窗口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多