using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestProcOutput
{
class Program
{
static int Main(string[] args)
{
//模擬Command Line Utility程式行為
if (args.Length == 1)
{
switch (args[0])
{
case "simu":
//間隔一秒由正常Output輸出0-4
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
//正常結束ExitCode = 0
return 0;
default:
//透過Error TextWriter輸出訊息
Console.Error.WriteLine("Syntax Error!");
//傳回ExtiCode = 1
return 1;
}
}
//宣告兩個Callback分別顯示Output及Error接收到的內容
Action<string> outcb = (s) =>
{
Console.WriteLine("OUT:" + s);
};
Action<string> errcb = (s) =>
{
Console.WriteLine("ERR:" + s);
};
//第一次測試由Output輸出
int exitCode = Execute("TestProcOutput", "simu", outcb, errcb);
Console.WriteLine("ExitCode={0}", exitCode);
//第二次則測試由Error輸出
exitCode = Execute("TestProcOutput", "boo", outcb, errcb);
Console.WriteLine("ExitCode={0}", exitCode);
Console.Read();
return 0;
}
public static int Execute(string exeFile, string argument,
Action<string> outputCallback, Action<string> errorCallback)
{
ProcessStartInfo si = new ProcessStartInfo()
{
FileName = exeFile,
Arguments = argument,
//必須要設定以下兩個屬性才可將輸出結果導向
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
//不顯示任何視窗
CreateNoWindow = true
};
Process p = new Process()
{
StartInfo = si,
EnableRaisingEvents = true,
};
//開始執行
p.Start();
//透過OutputDataReceived及ErrorDataReceived即時接收輸出內容
p.OutputDataReceived +=
(o, e) =>
{
if (!string.IsNullOrEmpty(e.Data) && outputCallback != null)
{
outputCallback(e.Data);
}
};
p.ErrorDataReceived +=
(o, e) =>
{
if (!string.IsNullOrEmpty(e.Data) && errorCallback != null)
{
errorCallback(e.Data);
}
};
//呼叫Begin*ReadLine()開始接收輸出結果
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
return p.ExitCode;
}
}
}