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 | ft Name 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管理單元中不能定義別名和變量,如果你需要這些功能,可以選擇使用腳本模塊。
