StreamReader.ReadToEnd()返回空字符串

时间:2018-04-17 18:59:45

标签: c# cmd streamreader

我正在尝试在cmd.exe中运行命令,并将输出重定向到文本文件。我已经验证了该命令正在执行,但是当我调用StandardOutput.ReadToEnd()或StandardError.ReadToEnd()时,将返回一个空字符串而不是该命令的文本输出。我错过了什么吗?

    ProcessStartInfo PSI = new ProcessStartInfo("cmd.exe", command);

    PSI.UseShellExecute = false;
    PSI.CreateNoWindow = true;
    PSI.RedirectStandardInput = true;
    PSI.RedirectStandardOutput = true;
    PSI.RedirectStandardError = true;
    PSI.Arguments = "/c";

    var proc = Process.Start(PSI);
    proc.WaitForExit();

    string output = proc.StandardOutput.ReadToEnd();
    Console.WriteLine(output);

    string errors = proc.StandardError.ReadToEnd();
    Console.WriteLine(errors);

1 个答案:

答案 0 :(得分:1)

如果您同时也在捕获错误输出,我非常确定使用TimeoutException无法正常工作。您需要使用proc.BeginOutputReadLine()代替(和ReadToEnd进行错误输出)。

但是,这些方法是异步的,因此您需要使用事件处理程序来实际获取输出。

proc.BeginErrorReadLine()

处理程序将输出/错误数据存储在事件参数的PSI.EnableRaisingEvents = true; proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(OutputReceivedHandler); proc.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(ErrorReceivedHandler); 属性中。

Data

由于这一切都是异步的,因此您希望放弃private void OutputReceivedHandler(object sender, DataReceivedEventArgs e) { Console.WriteLine(e.Data); } private void ErrorReceivedHandler(object sender, ErrorReceivedEventArgs e) { Console.WriteLine(e.Data); } 调用,因为这会不必要地阻止。如果您执行希望调用阻止,则可以使用WaitForExit,但请参阅the answer that user Greg linked in the comments以获取不会导致缓冲区溢出的实现。