我正在写一个包装的CMD,但有麻烦redirect标准input

好吧,这就是我正在做的 – 我想写一个.net应用程序,redirect标准输出到一个richtextbox。 我已经得到了很好的工作,但是一旦我将标准input添加到混音中,我的读命令就会冻结。 以下是我的表单中的相关代码。

Shell = new Process(); Shell.StartInfo.FileName = "cmd"; Shell.StartInfo.UseShellExecute = false; Shell.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; Shell.StartInfo.CreateNoWindow = true; //Shell.StartInfo.RedirectStandardInput = true; Shell.StartInfo.RedirectStandardOutput = true; Shell.StartInfo.RedirectStandardError = true; Shell.EnableRaisingEvents = true; Shell.OutputDataReceived += new DataReceivedEventHandler(Shell_OutputDataReceived); Shell.ErrorDataReceived += new DataReceivedEventHandler(Shell_OutputDataReceived); Shell.Start(); Timer consoleReader = new Timer(); consoleReader.Interval = 200; consoleReader.Tick += new EventHandler(consoleReader_Tick); consoleReader.Start(); } void consoleReader_Tick(object sender, EventArgs e) { textArea.AppendText(Shell.StandardOutput.ReadToEnd()); } 

我也尝试过在Process类中使用asynchronous读取方法,但是,一旦我将standardinputredirect = true添加到混合中,读取一行或多行后就会挂起。

任何想法家伙?

好的,下面是一个示例程序。 我将这段代码移到了一个控制台应用程序中,以简化一些事情。 为什么这个坏了?

 using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; namespace TestAsConsoleApp { class Program { static Process Shell; static void Main(string[] args) { Shell = new Process(); Shell.StartInfo.FileName = "cmd"; Shell.StartInfo.UseShellExecute = false; Shell.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; Shell.StartInfo.CreateNoWindow = true; Shell.StartInfo.RedirectStandardInput = true; Shell.StartInfo.RedirectStandardOutput = true; Shell.StartInfo.RedirectStandardError = true; Shell.Start(); Shell.EnableRaisingEvents = true; Shell.OutputDataReceived += new DataReceivedEventHandler(Shell_OutputDataReceived); Shell.BeginOutputReadLine(); Shell.WaitForExit(); } static void Shell_OutputDataReceived(object sender, DataReceivedEventArgs e) { if (e.Data != null) Console.WriteLine(e.Data); } } } 

Solutions Collecting From Web of "我正在写一个包装的CMD,但有麻烦redirect标准input"

如果您正在异步读取,则不需要同步读取,并且同步代码已被破坏,因为它会阻塞,直到接收到所有输出为止,而在UI线程中则不应该这样做。 如果我是你的话,我只需要去找异步代码。

现在,你想用控制台什么? 你说标准输入是造成问题 – 你想写什么? 你明确地冲洗吗?

修改后的程序看起来不会被打破。 你创建一个进程请求所有的流将被重定向。 触发所创建的过程输出的异步读取。 那你就等一下 在你的情况下,创建的cmd.exe在其输入流中没有得到任何东西,所以它不会产生任何输出。 可以尝试下面的程序。 运行它,并提供一些命令,如dir等它会产生输出。 希望我没有误解你的问题。

  using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; namespace TestAsConsoleApp { class Program { static Process Shell; static void Main(string[] args) { Shell = new Process(); Shell.StartInfo.FileName = "cmd"; Shell.StartInfo.UseShellExecute = false; Shell.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; Shell.StartInfo.CreateNoWindow = true; Shell.StartInfo.RedirectStandardInput = true; Shell.StartInfo.RedirectStandardOutput = true; Shell.StartInfo.RedirectStandardError = true; Shell.Start(); //Shell.StandardInput.WriteLine("dir"); Shell.EnableRaisingEvents = true; Shell.OutputDataReceived += new DataReceivedEventHandler(Shell_OutputDataReceived); Shell.BeginOutputReadLine(); //read input from your programs input and forward that to the created cmd 's input do { string aLine = Console.ReadLine(); Shell.StandardInput.WriteLine(aLine); if (aLine.ToLower() == "exit") break; }while(true); Shell.WaitForExit(); } static void Shell_OutputDataReceived(object sender, DataReceivedEventArgs e) { if (e.Data != null) Console.WriteLine(e.Data); } } }