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を未設定のままにすると、子プロセスの出力が子プロセスのコンソールウィンドウに正しく送信されます。

基盤となるwin32apiを見ると、 http: //msdn.microsoft.com/en-gb/library/windows/desktop/ms686331%28v=vs.85%29.aspxは次のように述べています。

dwFlagsがSTARTF_USESTDHANDLESを指定している場合、このメンバー[hStdOutput]はプロセスの標準出力ハンドルです。それ以外の場合、このメンバーは無視され、標準出力のデフォルトはコンソールウィンドウのバッファです。

stdinをリダイレクトするには、STARTF_USESTDHANDLESを設定する必要があります。stdoutをコンソールウィンドウに転送する他の方法はありますか?

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 に答える