如果大家跟我一樣,常整合外部程式搞一些有的沒的,那一定可以用到這個函數。

它最常見的情境是整合一些好用的命令列工具(通常是用來查詢資訊),把它辛苦執行的結果佔為已有。例如: netstat -oa可以列出機器的網路連線狀況。如果我們希望要在.NET程式中提供這類資訊,要怎麼寫?

我們當然可以設法想辦法四處張羅Library、Windows API、WMI... 在程式中實作出類似的效果。

另一種鋸箭式的思考是"撿現成"!! 由我們的程式呼叫netstat.exe, 再去解讀它的輸出結果。其實,這種Pipeline的觀念,本來就是UNIX或PowerShell裡整合不同程式的慣用手法,大家也不必有什麼罪惡感。唯一要考量的是因為它會另起一個Process,耗用資源較多,對效能也稍有減損,不適合用在Web之類效能敏感的應用。

//執行外部程式並將執行結果以字串方式傳回
public string Shell(string exeFile, string argument)
{
    Process pShell = new Process();
    pShell.StartInfo.FileName = exeFile;
    pShell.StartInfo.Arguments = argument;
    //必須要設定以下兩個屬性才可將輸出結果導向
    pShell.StartInfo.UseShellExecute = false;
    pShell.StartInfo.RedirectStandardOutput = true;
    //不顯示任何視窗
    pShell.StartInfo.CreateNoWindow = true;
    //開始執行
    pShell.Start();
    pShell.WaitForExit();
    //將StdOUT的結果轉為字串, 其中StandardOutput屬性類別為StreamReader
    return pShell.StandardOutput.ReadToEnd();
}

以下是一個超簡單的應用範例,呼叫Ping.exe並解析結果看IP是否活著:

bool bAlive = (Shell("ping.exe", "-n 1 192.168.1.254").IndexOf("Reply")>-1);


Comments

Be the first to post a comment

Post a comment


57 + 40 =