TIPS-Excute EXE And Get Its Output From .NET
0 |
如果大家跟我一樣,常整合外部程式搞一些有的沒的,那一定可以用到這個函數。
它最常見的情境是整合一些好用的命令列工具(通常是用來查詢資訊),把它辛苦執行的結果佔為已有。例如: 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