PowerShell 3.0 实践(四)开发自定义 PSSnapin
PowerShell通过Snapin提供了一个可扩展的体系结构,以便用户添加自定义的功能。Snapin是一组.NET程序集,说白了就是一个个类。
任何一个.NET程序集,只要实现了Snapin的安装程序类,就可以成为一个Snapin。
注:PowerShell 3.0 CTP2已经发布,可以在这里下载
自从 CTP1 以来的改动有:
- 修复了大量用户在 CTP1 中找到的问题。具体的问题列表可以在发布注释还有 Connect 中找到。
- Windows PowerShell ISE 中可以开启单独的命令行窗口。
- 可以通过 Update-Help 来更新本地的帮助。所有的帮助将从 Internet 获得。
- 在 Windows PowerShell Workflows 的支持上本次发布包含了大量的改进,包括: Parallel, Sequence 和 Inlinescript。
- Get-Module 现在支持从任何远程 Session 或者 CIM Session 获得模块。
具体的改动请参看WMF CTP2 Release Notes.docx (发布注释)
PowerShell 3.0提供了如下Snapin:
Get-PSSnapin
下面我们动手来开发一个Snapin。
1、我使用的Visual Studio 11 Developer Preview,新建一个Class Library项目:
2、添加System.Management.Automation引用,System.Management.Automation是PowerShell SDK的一部分,安装PowerShell 3.0时已经安装在GAC中。
3、继承PSSnapIn 类,这是一个抽象类,自定义的Snapin需要继承它。Name是自定义的Snapin的名称,Verdor是作者,Description是对该Snapin的简短描述。
2 public class Test : PSSnapIn
3 {
4 // Name for the PowerShell snap-in.
5 public override string Name
6 {
7 get
8 {
9 return "Brooks.Scripts.PowerShell.Test";
10 }
11 }
12
13 // Vendor information for the PowerShell snap-in.
14 public override string Vendor
15 {
16 get
17 {
18 return "Brooks";
19 }
20 }
21
22 // Description of the PowerShell snap-in
23 public override string Description
24 {
25 get
26 {
27 return "This is a sample PowerShell snap-in";
28 }
29 }
30 }
4、添加自己的Cmdlet,实现一些功能。我准备开发一个Excel的帮助命令,在指定位置生成一个Excel文档。
为此,先添加Office PIA的引用:Microsoft.Office.Interop.Excel
5、编写一个类继承Cmdlet,参数以属性的形式体现,一般需要重写BeginProcessing()、ProcessRecord()、EndProcessing()三个方法。
BeginProcessing():执行初始化操作,如验证参数、准备数据等。
ProcessRecord():执行核心命令逻辑。
EndProcessing():收尾工作,如资源释放、记录日志等。
PowerShell的命令采用的是 动词-名词 的结构,这里我使用的New-Excel命令。
参数声明中,Mandatory = true表示是必须参数,Position = 1 表示是位置参数,这样就可以根据位置来自动推断参数。
2 public class AddTest : Cmdlet
3 {
4 private string __Path = string.Empty;
5 private Excel.XlFileFormat __Format = Excel.XlFileFormat.xlOpenXMLWorkbook;
6
7 [Parameter(Mandatory = true, Position = 1)]
8 public string Path
9 {
10 get
11 {
12 return this.__Path;
13 }
14 set
15 {
16 this.__Path = value;
17 }
18 }
19
20 [Parameter(Mandatory = true, Position = 2)]
21 public Excel.XlFileFormat Format
22 {
23 get
24 {
25 return this.__Format;
26 }
27 set
28 {
29 this.__Format = value;
30 }
31 }
32
33 protected override void BeginProcessing()
34 {
35 base.BeginProcessing();
36 }
37
38 protected override void ProcessRecord()
39 {
40 Excel.Application __app = new Excel.Application();
41 __app.DisplayAlerts = false;
42 Excel.Workbook __book = __app.Workbooks.Add();
43 try
44 {
45 __book.SaveAs(this.Path, this.Format);
46 }
47 catch
48 { }
49 finally
50 {
51 __app.Quit();
52 System.Runtime.InteropServices.Marshal.ReleaseComObject(__book);
53 System.Runtime.InteropServices.Marshal.ReleaseComObject(__app);
54 __book = null;
55 __app = null;
56 }
57 }
58
59 protected override void EndProcessing()
60 {
61 base.EndProcessing();
62 }
63 }
6、这样一个Snapin就开发完成了,为了在脚本中使用,需要注册该Snapin并执行导入。
以管理员身份运行PowerShell ISE,执行以下脚本,将路径更改为你本机的目录。
Set-Location E:\Work\Project\BrooksCom\Brooks.Scripts.PowerShell\Brooks.Scripts.PowerShell\bin\Debug
Set-Alias installutil $env:windir\microsoft.net\framework64\v4.0.30319\installutil
installutil -i Brooks.Scripts.PowerShell.dll
installutil是.NET自带的安装工具,默认位于:
%windir% \Microsoft.NET\Framework64\v4.0.30319 --- Windows x64
%windir% \Microsoft.NET\Framework\v4.0.30319 --- Windows x86
注意64位和32位操作系统分别使用对应的installutil。
下面导入该Snapin:
Add-PSSnapin -Name Brooks.Scripts.PowerShell.Test
验证是否导入成功:
Get-PSSnapin –Registered
自定义的Snapin位于注册表的如下位置:
7、最后来执行以下我们的命令:New-Excel
New-Excel -Path E:\Test.xlsx -Format xlOpenXMLWorkbook
可以看到,顺利生成了Excel文档:
小结:
PowerShell 3.0包含了众多的命令,几乎可以管理所有的方面,尤其在Windows Server 8中,PowerShell 已经处于核心地位。
公司的CTO是一位批处理、汇编高手,但是当我向他推荐PowerShell时,他却不屑一顾,觉得太不伦不类,原话是"什么鸟语法" J
这也从侧面验证了PowerShell现在的处境以及被高级管理人员所误解的程度。本次从一个自定义Snapin的开发展示了PowerShell的可扩展性,与开发一个普通的组件没有什么区别。我个人表示看好PowerShell在企业级管理中的前景,PowerShell也可以扩展为脚本引擎嵌入ERP等系统中,执行部署、流程控制、自动化操作等。