2015-06-14 37 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輸出在當前目錄下的所有文件的屬性,並返回輸出

相關問題