2013-07-21 110 views
3

我使用System.Diagnostics.Process與stdin/out/err被重定向到的第三方控制檯應用程序交互 (外部程序是用C++編寫的,我無法控制它)。當ProcessStartInfo.CreateNoWindow設置爲true時,爲什麼RedirectStandardInput沒有效果?

ProcessStartInfo info = new ProcessStartInfo(fileName, arg); 
info.CreateNoWindow = false; // <- if true, stdin writes don't make it through 
info.UseShellExecute = false; 
info.RedirectStandardInput = true; 
info.RedirectStandardOutput = true; 
info.RedirectStandardError = true; 

var proc = new Process() { StartInfo = info }; 
proc.OutputDataReceived += new DataReceivedEventHandler(myOutputHandler); 
proc.ErrorDataReceived += new DataReceivedEventHandler(myErrorHandler); 
proc.Start(); 
proc.BeginOutputReadLine(); 
proc.BeginErrorReadLine(); 

後來......

proc.StandardInput.WriteLine("some-short-command"); 

在測試控制檯應用程序的工作原理確定時info.CreateNoWindow = FALSE; 但是當info.CreateNoWindow = true時沒有效果;

在這兩種情況下,輸出和錯誤重定向均正常工作。

上述代碼是定義FinalBuilder自定義操作的類庫的一部分。 所描述的行爲可以從測試控制檯應用程序中觀察到,或從FinalBuilder桌面應用程序中運行。

有趣的是,當從第三個上下文運行 - FinalBuilder服務器 - 具有相同的用戶和環境時,無論info.CreateNoWindow是true還是false,StandardInput.WriteLine都不起作用。

這是怎麼回事?

無論執行上下文如何,我可以使stdin重定向工作嗎?

+1

控制檯模式應用程序有兩種*寫入控制檯的方法。他們可以寫入標準輸出,就像* nix程序一樣。或者他們可以使用本機控制檯API進行編寫。添加味道,如響應單個按鍵和添加顏色。第一個將重定向,第二個不會。你得到了不幸的畫。 –

+0

感謝您的洞察力。是否有任何解決方法使用本地控制檯API向這樣的控制檯應用程序發送輸入? – 0li

+0

如果本地控制檯API應用程序不會重定向我很困惑,因爲我的重定向,但不是在所有情況下......我必須在這裏失去一些東西。 – 0li

回答

0

不知道爲什麼,但明確指定這裏的用戶解決了這個問題:

proc.UserName = user; 
proc.Domain= domain; 
proc.Password= password; 

不是很優雅,但對我的作品,並可以幫助別人。

相關問題