文章目錄
- 編寫嵌入式管理單元
- 使用嵌入式管理單元
- 編寫二進位模組
- 結語
PowerShell一開始就提出利用嵌入式管理單元來實現自訂cmdlet,為大型軟體系統提供有別於UI介面的指令碼化管理方案。在PowerShell V2中,PowerShell嵌入式管理單元還能以二進位模組的方式處理。
編寫嵌入式管理單元
編寫PowerShell嵌入式管理單元需要依賴System.Management.Automation程式集;而System.Management.Automation程式集是Windows SDK的一部分,所以安裝Windows SDK是編寫PowerShell嵌入式管理單元的先決條件。可以從這裡下載Windows SDK。
作為編寫PowerShell嵌入式管理單元的準備,我們先開啟VS2008或者VS2010,建立一個類庫項目,目標.Net Framework版本選擇3.5。簡單編譯通過之後,就可以編寫cmdlet命令類和SnapIn安裝類了。
編寫cmdlet類
自訂cmdlet類有以下幾個步驟:
1、在項目中添加對System.Management.Automation程式集的引用(路徑是C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll);並且添加相應命令空間的引用using System.Management.Automation;
2、建立名為New-Addition的類,添加對命令空間System.Management.Automation的引用;
3、讓New-Addition類繼承自PSCmdlet,並給New-Addition類添加Cmdlet屬性標記,設定動詞和名詞;
4、添加參數資訊,參數一定要用Parameter屬性標記;
5、重載ProcessRecord函數,實現自己的商務邏輯;
編寫cmdlet類的樣本如下(本文樣本參考了Ivor Bright's blog):
using System;using System.Management.Automation;namespace PSSnapInDemo1{ [Cmdlet(VerbsCommon.New, "Addition")] public class New_Addition: PSCmdlet { [Alias("X")] [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)] public int FirstParameter { get; set; } [Alias("Y")] [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)] public int SecondParameter { get; set; } protected override void ProcessRecord() { WriteObject(string.Format("{0} + {1} = {2}", this.FirstParameter, this.SecondParameter, this.FirstParameter + this.SecondParameter)); } }}
編譯通過後,自訂的cmdlet類就完成了,接下來就可以編寫PSSnapIn安裝類了。
編寫PSSnapIn安裝類
編寫PSSnapIn安裝類的目的是使該類庫能夠被安裝,並且被系統識別為PowerShell嵌入式管理單元。步驟如下:
1、添加對System.Configuration.Install程式集的引用;
2、建立名為PSSnapInInstaller的類,添加對命名空間System.ComponentModel和System.Management.Automation的引用;
3、讓PSSnapInInstaller類繼承自PSSnapIn,並且以RunInstaller(true)屬性標識它。
4、重載Name、Vendor和Description三個屬性;
樣本如下:
using System;using System.Management.Automation;using System.ComponentModel;namespace PSSnapInDemo1{ [RunInstaller(true)] public class PSSnapInInstaller : PSSnapIn { public override string Description { get { return "This is Luke's first Snap In demo"; } } public override string Name { get { return "PSSnapInDemo1"; } } public override string Vendor { get { return "CaiJu"; } } }}
編譯通過以後,PSSnapIn安裝類也完成了,這樣我們編寫代碼的工作就全部完成了。編譯整個解決方案,產生類庫檔案。
使用嵌入式管理單元
編寫好的嵌入式管理單元,在使用之前需要先註冊。註冊流程如下:
1、開啟Visual Studio內建的命名行,並且導航到PSSnapInDemo1.dll的目錄中;
2、執行“installUtil /i PSSnapInDemo1.dll”命令;
如上命令如果成功執行,註冊過程就完成了;如果不成功,請仔細檢查安裝過程的log檔案。
PowerShell嵌入式管理單元註冊成功後,就可以將其添加到當前會話中使用了。尋找已經註冊的PowerShell嵌入式管理單元,可用以下命令:
PS C:\Users\luke> Get-PSSnapin -Registered | ftName PSVersion Description---- --------- -----------PSSnapInDemo1 2.0 This is Luke's first Snap I...SqlServerCmdletSnapin100 2.0 This is a PowerShell snap-i...SqlServerProviderSnapin100 2.0 SQL Server Provider
以上命令的輸出結果已經顯示出了我們剛剛註冊的PowerShell嵌入式管理單元,添加嵌入式管理單元使用如下命令:
PS C:\Users\luke> Add-PSSnapin -Name PSSnapInDemo1
PowerShell嵌入式管理單元添加成功後,就可以使用其中的命令了,使用方法與使用系統內建的cmdlet命令相同。
編寫二進位模組
編寫二進位模組的編寫與編寫嵌入式管理單元的方法基本相同,都需要實現cmdlet類,但它不需要實現安裝類。具體方法參見上述編寫cmdlet類的步驟。需要說明的是,同時實現了PSSnapIn類的類庫,仍然可以當作二進位模組來使用。也就是說,PowerShell嵌入式管理單元的組件檔,可以不加修改的當成二進位模組的程式集來使用。
使用二進位模組
二進位模組的使用與PowerShell入門(十一):編寫指令碼模組中指令碼模組的使用方法相同,即在搜尋目錄下建立同名檔案夾,並將程式集拷貝進去,可選建立描述檔案等;然後尋找和匯入模組。之後,二進位模組中的命令就可以使用了。
結語
除了自訂cmdlet外,PowerShell嵌入式管理單元還可以編寫自訂提供者。提供者是一個更進階別的概念,系統預定義的有檔案系統、註冊表和認證等。不過,PowerShell嵌入式管理單元中不能定義別名和變數,如果你需要這些功能,可以選擇使用指令碼模組。