注:本篇文章,未在聯系作者以及得到許可的情況下, 禁止以任何形式進行轉載。
By:Anders Mail:[email protected]
發表此文的原因是由于本人在閱讀ghjcona兄寫的PowerShell筆記中,其中有一篇談到Native Windows Command的話題所引發的。
話題如下:
這比使用WMI的Win32_PingStatus簡潔多了,當然你要是問為什麼不使用直接使用Ping(還有比如dir,del,findstr 等Windows Native Command)呢?
首先我們來看看什麼叫做Native Windows Command,引用由我的朋友 Edengundam 大哥所寫的一段話(具體也可以去MS的KB裡搜尋相關内容),内容如下:
Native Windows Command
我不知道應該這個東西用什麼名字. 這類指令在Windows世界大量存在, 譬如: dir, findstr, del, ping. 這些指令就是Windows之前的可執行檔案(非.Net指令行可執行檔案). 在PowerShell中調用這些指令效率是最低的, 因為執行他們PowerShell需要建立一個新程序. 此外因為這些指令早于PowerShell, 是以他們的資訊輸出都是基于文本的(也可以說是字元串), 是以喪失了PowerShell對對象的處理能力. 是以, 如果你知道PowerShell的實作, 就避免使用這些指令.
(補:關于Native Windows Command到底該翻譯成什麼意思,我與Edengundam的讨論覺得應翻譯為“Windows内置(本地)指令”,最後我在MS官方直譯文章中看到MS将Native Windows Command翻譯為“Windows原生指令”)
本着科學探索的原則^_^ 我們來測試下Native Windows Command是不是真的比Native PowerShell Command執行效率低呢?
我們先建立兩個互動式腳本(嚴格的講并非是腳本,我在這姑且用腳本一詞)檔案。
兩個腳本檔案名為:dos_ping.ps1 和 ps_ping.ps1
dos_ping.ps1 内容如下:(也就是我們之前說的Native Windows Command)
ping 127.0 . 0.1
ps_ping.ps1 内容如下:(PowerShell的調用對象)
$ping = New - Object System.Net.NetworkInformation.Ping
$ping.send( " 127.0.0.1 " )
接下來我們建立一個主測試PowerShell腳本檔案:start_ping.ps1
start_ping.ps1内容如下:
Write - Host " ============================== "
Measure - Command {C:/ ps_ping.ps1} | findstr " TotalSeconds " | Format - list
Measure - Command {C:/ dos_ping.ps1} | findstr " TotalSeconds " | Format - list
Write - Host " ============================== "
Measure - Command {C:/ ps_ping.ps1} | findstr " TotalSeconds " | Format - list
Measure - Command {C:/ dos_ping.ps1} | findstr " TotalSeconds " | Format - list
Write - Host " ============================== "
Measure - Command {C:/ ps_ping.ps1} | findstr " TotalSeconds " | Format - list
Measure - Command {C:/ dos_ping.ps1} | findstr " TotalSeconds " | Format - list
Write - Host " ============================== "
Stop - Process - name notepad
補:Measure-Command是一個度量指令,它的作用是擷取指令所執行的時間。為了便于觀察,在這裡還我用了findstr性質提取"TotalSeconds" 總的使用時間。
好了,三個必備檔案都準備好了,接下來我們執行start_ping.ps1看看結果如何:
經過三次測試比較,在PowerShell中使用Native Windows Command所花費的總時間遠遠高于Native PowerShell Command。
那為什麼Native Windows Command的所用時間那麼高呢, 因為執行他們PowerShell需要建立一個新程序。而PowerShell Command則不需要。 (如下圖:在執行單純的Native Windows Command時在任務管理器中啟動了ping.exe程序)
是以也就證明了,在PowerShell中調用Native Windows Command的效率遠低于Native PowerShell Command。
這裡隻是對于Native Command執行效率的一個小小的資料測試說明,有不到之處還望指出。