2015-04-25 45 views
0

很多天我爲此問題進行了Google搜索,但沒有找到任何答案。 我有這樣的批處理文件。重定向命令行輸出,包括用戶輸入的文本提示C#

@ECHO OFF 
ECHO This is sample output. 
SET /P uname=Please enter your name: 
IF "%uname%"=="" GOTO Error 
ECHO Hello %uname%, Welcome to DOS inputs! 
GOTO End 
:Error 
ECHO You did not enter your name! Bye bye!! 
:End 
pause 

如何從該命令中看到它會打印出「This is sample output。」。然後會詢問用戶名稱。在C#上「這是示例輸出。」行將被作爲輸出數據接收,但文本「請輸入您的名字:」我們只有在控制檯輸入一些東西后纔會收到。 那麼,我們如何才能在輸入內容之前接收提示輸出,我們可以重定向完整控制檯嗎? (如果我們可以這樣說)。 以下是測試應用程序。

using System; 
using System.Diagnostics; 

namespace CommandExecuter 
{ 
    static class Program 
    { 
     static void Main() 
     { 
      try 
      { 
       var start = new ProcessStartInfo 
       { 
        FileName = @"C:\run.cmd", 
        UseShellExecute = false, 
        RedirectStandardOutput = true, 
        RedirectStandardError = true 
       }; 

       using (var process = new Process()) 
       { 
        process.StartInfo = start; 
        process.OutputDataReceived += process_OutputDataReceived; 
        process.ErrorDataReceived += process_ErrorDataReceived; 

        process.Start(); 

        process.BeginOutputReadLine(); 
        process.BeginErrorReadLine(); 

        process.WaitForExit(); 

        process.CancelOutputRead(); 
        process.CancelErrorRead(); 
       } 

      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Failed to execute command: " + ex.Message); 
      } 
      finally 
      { 
       Console.ReadLine(); 
      } 
     } 

     private static void process_OutputDataReceived(object sender, DataReceivedEventArgs e) 
     { 
      if (!string.IsNullOrEmpty(e.Data)) 
      { 
       Console.Write("OutputDataReceived: " + e.Data + Environment.NewLine); 
      } 
     } 

     private static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
     { 
      if (!string.IsNullOrEmpty(e.Data)) 
      { 
       Console.Write("ErrorDataReceived: " + e.Data + Environment.NewLine); 
      } 
     } 
    } 
} 

回答

0

改變你的一段時間。我覺得你越來越多回線路

 private static void process_OutputDataReceived(object sender, DataReceivedEventArgs e) 
 
     { 
 
      while (!string.IsNullOrEmpty(e.Data)) 
 
      { 
 
       Console.Write("OutputDataReceived: " + e.Data + Environment.NewLine); 
 
      } 
 
     } 
 

 
​

+0

如果我們如果要同時改變,那麼它永遠不會結束,因爲我們總是會在,而真正的,如果e.Data不爲空或空。 – Art

+0

不正確。如果字符串爲空,則會退出循環。問題是你在輸入緩衝區中有兩個字符串,而你只有'if'的第一個字符串。您必須從緩衝區中清除兩個字符串,否則顯示您收到顯示的錯誤消息(上一條消息)。 – jdweng

+0

對於我的例子e.Data不是null,所以雖然會永遠循環。 另外,e.Data不會包含「請輸入您的姓名:」數據,直到將任何內容打磨爲過程流輸入。 – Art

相關問題