TIPS-Excute EXE And Get Its Output From .NET

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

它最常見的情境是整合一些好用的命令列工具(通常是用來查詢資訊),把它辛苦執行的結果佔為已有。例如: 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);

歡迎推文分享:
Published 17 August 2007 03:20 PM 由 Jeffrey
Filed under: , ,
Views: 9,043



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<August 2007>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication