执行命令行并允许命令行输出';正在发生

本文关键字:命令行 输出 执行 | 更新日期: 2023-09-27 18:00:54

我想在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;

这是因为我运行的一个进程需要很长时间才能加载。。。当然,在处理完成之前,它不会向命令行输出任何内容。

执行命令行并允许命令行输出';正在发生

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

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

// 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
  }
}

我认为你的问题在这里:

string result = process.StandardOutput.ReadToEnd();

ReadToEnd:

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

它会一直尝试阅读所有内容,直到完成才回来。

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

如果您只想在进程输出时读取输出,而不是等待它完成,请使用ReadLine而不是ReadToEnd

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