2010-07-22 92 views
10

我可以運行使用process.start()的命令行進程。 我可以使用標準輸入提供輸入。之後,當進程再次要求用戶輸入時,我的程序如何知道並將輸入傳遞給該exe文件?使用c運行交互式命令行exe#

+0

你可能感興趣的[這篇文章](http://www.codeducky.org/process-handling-net)涵蓋了許多錯綜複雜的工作。 NET進程,尤其是在處理輸入和輸出 – ChaseMedallion 2014-08-29 01:38:17

回答

10

有一個example here聽起來類似於你需要什麼,使用Process.StandardInputStreamWriter

 Process sortProcess; 
     sortProcess = new Process(); 
     sortProcess.StartInfo.FileName = "Sort.exe"; 

     // Set UseShellExecute to false for redirection. 
     sortProcess.StartInfo.UseShellExecute = false; 

     // Redirect the standard output of the sort command. 
     // This stream is read asynchronously using an event handler. 
     sortProcess.StartInfo.RedirectStandardOutput = true; 
     sortOutput = new StringBuilder(""); 

     // Set our event handler to asynchronously read the sort output. 
     sortProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler); 

     // Redirect standard input as well. This stream 
     // is used synchronously. 
     sortProcess.StartInfo.RedirectStandardInput = true; 
     sortProcess.Start(); 

     // Use a stream writer to synchronously write the sort input. 
     StreamWriter sortStreamWriter = sortProcess.StandardInput; 

     // Start the asynchronous read of the sort output stream. 
     sortProcess.BeginOutputReadLine(); 
     Console.WriteLine("Ready to sort up to 50 lines of text"); 
     String inputText; 
     int numInputLines = 0; 
     do 
     { 
      Console.WriteLine("Enter a text line (or press the Enter key to stop):"); 

      inputText = Console.ReadLine(); 
      if (!String.IsNullOrEmpty(inputText)) 
      { 
       numInputLines ++; 
       sortStreamWriter.WriteLine(inputText); 
      } 
     } 

希望幫助

+0

再次感謝。但這是特定於sort.exe 我在運行時爲每個用戶生成exe文件。我不知道他會輸入哪個節目。 – rajshades 2010-07-22 12:28:05

+0

我認爲你可以使用「cmd.exe」而不是他們選擇的可執行文件。這是一個黑客,但它可能完成這項工作 – 2010-07-22 12:35:49

+0

親愛的羅伯特·u能PLZ解釋如何使用CMD.EXE我的問題 – rajshades 2010-07-23 05:07:41

2

如果我理解正確,我認爲您應該可以通過使用RedirectStandardOutputRedirectStandardInput重定向標準輸入/輸出來完成此操作。

WinSCP項目有一個C#示例,用於如何使用這種方式與它進行通信。你可以在這裏找到它:SFTP file transfers in .NET(雖然此示例僅收集輸出,而不使用它所有,但該技術應該是一樣的。)

+0

謝謝你的答覆。我嘗試過這個。但是要求用戶輸入的過程不是預定義的。該方案是像 1.我想設計在線compliler爲C# 2.我可以使用代碼創建該程序n cretae exe文件 3.現在我想通過C#運行該exe文件 4.用戶可以編寫任何類型的在diff階段需要用戶輸入的程序。 希望你能理解整個場景 – rajshades 2010-07-22 12:21:18

+0

@rajshades:我會認爲這會是類似的,但不是一次性發送所有命令,而是發送命令,讀取輸出,發送下一個命令等我雖然沒有測試過。作爲一個普遍的說明,如果你正在創建這個exe文件,你能不能嘗試給它一些更好的方式來與它進行通信(WCF,TCP/IP協議,命名管道等)? – 2010-07-22 12:49:48

1

你想查找IPC。正如羅伯特所示,.NET中的Process類將幫助您。但專門爲你的問題(如何知道何時寫數據):你不能。不是一般的。

如果您知道所需的輸入(例如「yyy」),則可以在創建的過程的STDIN中提供。您不必等待程序請求這些信息:它只會在需要數據時從STDIN中讀取。

如果您需要處理程序輸出以決定要寫入STDIN的內容,請嘗試閱讀進程STDOUT。你可能會遇到沖洗的問題,雖然...