PowerShell與Framework集成實現參數自動傳遞 |
發布時間: 2012/7/12 10:16:26 |
在實際工作中,系統管理員可能會遇到這種情況:前面一個命令的結果,剛好是后面一個命令的參數。這種需求在Linux等操作系統中可以輕松的實現,但是在傳統的Windows環境中,實現起來卻有一定的困難。不過在Win2008中,可以將PowerShell與Framework集成,來實現這種需求。
一、傳統解決方案的弊病。 由于Windows的Shell是運行在基于文本的環境當中。為此為了自動化目標就必須要對輸出進行格式化操作。如現在需要將某個命令的結果傳遞到下一個命令作為參數,就必須要對前面一個命令的結果的輸出進行格式化操作,以滿足于第二個命令的要求。也就是說,無法直接將第一個命令的結果傳遞到后面一個命令中去。 這種格式化的操作,從理論上說是可行的。但是,通常情況下將文本數據轉換為可用的格式中間需要大量的動作。有時候即使文本內容一個字沒變,而只是格式不同,進行格式化操作仍然需要耗費大量的資源。所以在以前的應用環境中,絕大部分系統工程師對于這個需求是望而生畏。不過在Win2008中,可以將Powershell與Frame結合,解決了這個難題。 PowerShell可以將數據不作為純文本形式進行傳送,而是以FrameWork對象的形式來檢索數據。如此的話,在不需要對結果進行格式化的情況下,后面一個命令就可以直接使用前面一個命令的結果來作為參數。為此系統不需要再修改文本數據,而只需要通過名稱來引用所需要的數據即可。在這個過程中,系統管理員并不需要編寫代碼來將數據轉換為有用的格式,而只需要引用對象并按需要來操作對象即可。 二、反射機制實現命令之間的自動詢問過程。 反射是Framework中的一個機制。通過這個機制,可以讓系統檢查對象并檢索他們支持的方法、屬性、字段等等。由于PowerShell是建立在這個機制之上的,為此系統工程師可以通過發射機制來實現參數的自動傳遞。簡單的說,就是通過Get-member Cmdlet來實現類似的功能。此時這個Cmdlet會幫助系統工程師分析通過管道傳遞的對象或者對象集合。筆者這里舉一個簡單的例子。如可以通過下面的命令分析某個命令返回的對象并顯示相關的屬性和方法。 Get-process | get-member. 其實用過Linux操作系統的用戶,對于這個命令是非常熟悉的。在Linux中,就是通過“|”符號將前后兩個命令聯系起來的。不過這里需要注意的是,雖然在Windows操作系統中也可以通過這個符號實現類似的功能,不過其背后的實現機制是不同的。在Windows中,在這里是借助了Framework框架下的發射機制。有時候我們也將這個過程叫做詢問對象機制。在實際工作中,會非常的有用。 三、ETS擴展類型系統實現數據類型的自動匹配。 眾所周知,無論是函數還是過程,都要強調數據類型的相互匹配。在參數自動傳遞的過程之中,如果數據類型不匹配,仍然無法滿足自動傳遞的需求。為了解決這個數據類型匹配的問題,系統中引入了ETS機制。 在說這個機制之前,筆者先給大家消除一個誤區。筆者以前在跟一些系統工程師交流的時候,他們認為PowerShell中的腳本是無類型的。其實這大錯特錯。雖然在實際工作中,很少需要指定變量的數據類型,但是這并不是說其沒有數據類型。這就好像一個人不說話,并不能夠代表其就是啞巴。從本質上說,PowerShell是數據類型驅動的。也就是說需要受到數據類型匹配的約束。只不過系統采用了ETS擴展類型系統機制,在工作時會對不同的數據類型自動進行轉換。真是因為這個機制,系統工程師不需要考慮對象的類型。因為PowerShell能夠適合不同的數據類型并向管理員顯示其對某個對象的理解。在了解這個機制時,筆者認為需要抓住如下幾個要點。 本文出自:億恩科技【www.sunshares.net】 |