我使用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重定向工作嗎?
控制檯模式應用程序有兩種*寫入控制檯的方法。他們可以寫入標準輸出,就像* nix程序一樣。或者他們可以使用本機控制檯API進行編寫。添加味道,如響應單個按鍵和添加顏色。第一個將重定向,第二個不會。你得到了不幸的畫。 –
感謝您的洞察力。是否有任何解決方法使用本地控制檯API向這樣的控制檯應用程序發送輸入? – 0li
如果本地控制檯API應用程序不會重定向我很困惑,因爲我的重定向,但不是在所有情況下......我必須在這裏失去一些東西。 – 0li