2015-06-14 52 views
1

我正在使用Process类来启动某个进程,它正在计算一些数据给它的控制台输出,我需要读取进程控制台的最后一行。应该怎么做?这是process.BeginOutputReadLine();,但我不知道如何使用只读LAST行。如何读取输出流程类的最后一行?

+0

只能输出或两个输出和错误的最后一行? – dotctor

+0

只输出,会尝试你的答案,看起来像这样 –

回答

3
string lastLine = null; 
while (!process.StandardOutput.EndOfStream) 
{ 
    lastLine = process.StandardOutput.ReadLine(); 
} 

//do what you want here with lastLine; 
1

这是应该做的代码,你需要的东西:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     public static Process ShellStart(string aCmd, TextWriter aOutputWriter = null, TextWriter aErrorWriter = null) 
     { 
      var vProcess = new Process(); 
      var vStartInfo = vProcess.StartInfo; 
      vStartInfo.FileName = Path.Combine(Environment.SystemDirectory, "CMD.EXE") ; 
      var vCmd = "/Q /C "; 
      vStartInfo.Arguments = vCmd + "\"" + aCmd + "\""; 
      vStartInfo.UseShellExecute = false; 
      vStartInfo.CreateNoWindow = true; 
      if (aOutputWriter != null) 
      { 
       vProcess.OutputDataReceived += (p, a) => 
       { 
        if (a.Data != null) 
        { 
         aOutputWriter.WriteLine(a.Data); 
        } 
       }; 
       vStartInfo.RedirectStandardOutput = true; 
       vStartInfo.RedirectStandardInput = true; 
      } 
      if (aErrorWriter != null) 
      { 
       vProcess.ErrorDataReceived += (p, a) => 
       { 
        if (a.Data != null) 
        { 
         aErrorWriter.WriteLine(a.Data); 
        } 
       }; 
       vStartInfo.RedirectStandardError = true; 
       vStartInfo.RedirectStandardInput = true; 
      } 
      if (!vProcess.Start()) return null; 
      if (aOutputWriter != null || aErrorWriter != null) 
       vProcess.Exited += (s, e) => 
       { 
        if (aOutputWriter != null) aOutputWriter.Flush(); 
        if (aErrorWriter != null) aErrorWriter.Flush(); 
       }; 
      if (aOutputWriter != null) vProcess.BeginOutputReadLine(); 
      if (aErrorWriter != null) vProcess.BeginErrorReadLine(); 
      if (vStartInfo.RedirectStandardInput) vProcess.StandardInput.Close(); 
      return vProcess; 
     } 

     public static int ShellExec(string aCmd, TextWriter aOutputWriter = null, TextWriter aErrorWriter = null) 
     { 
      var vResult = -1; 
      using (var vProcess = ShellStart(aCmd, aOutputWriter, aErrorWriter)) 
       if (vProcess != null) 
       { 
        vProcess.WaitForExit(); 
        vResult = vProcess.ExitCode; 
        vProcess.Close(); 
       } 
      return vResult; 
     } 

     public static IEnumerable<String> SplitLines(string s) 
     { 
      string vLine; 
      if (!String.IsNullOrEmpty(s)) 
       using (var vReader = new StringReader(s)) 
        while ((vLine = vReader.ReadLine()) != null) 
        { 
         yield return vLine; 
        } 
     } 

     public static string ShellExecGetLastLine(string aCmd) 
     { 
      var vOutput = new StringBuilder(); 
      using (TextWriter vWriter = new StringWriter(vOutput)) 
      { 
       ShellExec(aCmd, vWriter, null); 
       return SplitLines(Convert.ToString(vOutput).Trim()).LastOrDefault(); 
      } 
     } 
     static void Main(string[] args) 
     { 
      Console.WriteLine(ShellExecGetLastLine("attrib")); 
     } 
    } 
} 

您可以使用ShellExecGetLastLine(command)其中command是路径到您的可执行文件(与参数一起,如果需要的话),以获得最后输出的一行。

在上面的例子中,它调用attrib输出在当前目录下的所有文件的属性,并返回输出