2011-12-13

redirect git stdout message

假如現在執行一個 git 指令 “git clone git://github.com/joyent/node” 其顯示的訊息(包含檔案下載的進度)為:


最後完成時顯示為:


若要在 C# 執行上述 git 指令,通常使用 System.Diagnostics.Process 來呼叫執行,其程式碼如下:
static void Main(string[] args)
{

    Process myProcess = new Process();
    ProcessStartInfo info = new ProcessStartInfo("git.exe", "clone git://github.com/joyent/node");
    info.CreateNoWindow = true;
    info.UseShellExecute = false;
    info.RedirectStandardOutput = true;
    info.WorkingDirectory = "";
    myProcess.StartInfo = info;
    myProcess.OutputDataReceived += new DataReceivedEventHandler(myProcess_OutputDataReceived);

    myProcess.Start();
    myProcess.BeginOutputReadLine();

    myProcess.WaitForExit();
    myProcess.Close();

}
static void myProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    if (!String.IsNullOrEmpty(e.Data))
    {
        Console.WriteLine("captured line> "+e.Data);
    }           
}
執行結果為:
由上圖發現執行過程中,只有顯示一行訊息,猜測是因為 git 在執行時期會呼叫其它的 process,而這些 process 所顯示的訊息未被 redirect 到 C#,下圖是 process explorer 在 git 執行時期所擷取的畫面,發現 git 的確產生 child process 來處理其它工作:

因此若要擷取 child process 顯示的訊息,改用下列指令:
cmd.exe /C “git.exe clone git://github.com/joyent/node –progress 2>&1”
程式碼修改為:
ProcessStartInfo info = new ProcessStartInfo("cmd.exe", "/C " + "" + "git.exe clone git://github.com/joyent/node --progress 2>&1" + "");
執行結果為:

終於把所有的訊息都 redirect 到 C# 了。

0 意見 :

張貼留言