2013-03-21 121 views
2

我試圖用stdin重定向到我自己創建的句柄來啓動一個子進程,但是將stdout和stderr指向了子進程的控制檯窗口。如何用stdin重定向啓動進程,但不啓用stdout?

實施例:

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還引起輸出和錯誤要被截取。如果RedirectStandardInput未設置,則子進程的輸出將正確發送到子進程的控制檯窗口。

綜觀底層的Win32 API,http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686331%28v=vs.85%29.aspx表示:

如果dwFlags中指定STARTF_USESTDHANDLES,此構件[hStdOutput]是 該進程的標準輸出句柄。否則,該成員被忽略, 緩衝區的標準輸出的默認值是控制檯窗口的 。

我們必須設置STARTF_USESTDHANDLES才能重定向stdin;有沒有其他方法可以將stdout指向控制檯窗口?

回答

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

+0

也許我應該更清楚了:我的主進程是不是一個控制檯應用程序;當我啓動子進程時,它會打開自己的控制檯緩衝區,但是如果你設置了RedirectStandardInput,輸出將被吞下(或者說,寫入主進程的標準輸出,在我的情況下這是無效的)。 我希望子進程的輸出轉到彈出的控制檯窗口。 – richvdh 2013-03-21 12:52:26

相關問題