执行命令行并允许命令行输出正在发生的事情

时间:2015-07-03 10:44:59

标签: c#

我想在C#中执行命令行,并且仍然让命令行写出它的输入。

目前我正在使用它:

// Now we create a process, assign its ProcessStartInfo and start it
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo = new ProcessStartInfo( "Cmd.exe" )
{
    WorkingDirectory = executableDirectoryName,
    UseShellExecute = false,
    RedirectStandardInput = true,
    RedirectStandardOutput = true,
    CreateNoWindow = false,
};

process.Start();

process.StandardInput.WriteLine( arguments.Command );
process.StandardInput.Flush();
process.StandardInput.WriteLine( "exit" );

// Get the output into a string
string result = process.StandardOutput.ReadToEnd();
CommandLineHelper.commandLineOutput = result;

这是因为我正在运行的其中一个进程需要很长时间才能加载...而且在进程结束之前,它不会向命令行输出任何内容。

3 个答案:

答案 0 :(得分:2)

我认为你的问题在这里:

string result = process.StandardOutput.ReadToEnd();

ReadToEnd

  

从当前位置读取所有字符到流的末尾。

总会尝试阅读所有内容,直到完成后才会返回。

Process.StandardOutputStreamReader,为什么不在循环中尝试ReadLine()

答案 1 :(得分:2)

您正在寻找的是异步读取,这是通过the BeginOutputReadline-method方法完成的,您已经按照您的方式激活了同步读取。

简而言之,这就是你需要做的事情:

// use asynchronous method
myProcess.OutputDataReceived += new DataReceivedEventHandler(MyHandler);

// start process
myProcess.Start();

// start the asynchronous read
myProcess.BeginOutputReadLine();

并定义myHandler

static void MyHandler(object sendingProcess, DataReceivedEventArgs output)
{
  if (!String.IsNullOrEmpty(output.Data))
  {
    Console.WriteLine(output.Data); // or whatever
  }
}

答案 2 :(得分:0)

如果您只想阅读流程中的输出,而不是等待它完成,请使用ReadLine代替ReadToEnd

  while (!process.StandardOutput.EndOfStream)
  {
      Console.WriteLine(process.StandardOutput.ReadLine());
  }