PowerShell 3.0 实践(四)开发自定义 PSSnapin

PowerShell通过Snapin提供了一个可扩展的体系结构,以便用户添加自定义的功能。Snapin是一组.NET程序集,说白了就是一个个类。

任何一个.NET程序集,只要实现了Snapin的安装程序类,就可以成为一个Snapin。

注:PowerShell 3.0 CTP2已经发布,可以在这里下载

自从 CTP1 以来的改动有:

  1. 修复了大量用户在 CTP1 中找到的问题。具体的问题列表可以在发布注释还有 Connect 中找到。
  2. Windows PowerShell ISE 中可以开启单独的命令行窗口。
  3. 可以通过 Update-Help 来更新本地的帮助。所有的帮助将从 Internet 获得。
  4. Windows PowerShell Workflows 的支持上本次发布包含了大量的改进,包括: Parallel Sequence Inlinescript
  5. 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.AutomationPowerShell SDK的一部分,安装PowerShell 3.0时已经安装在GAC中。


3、继承PSSnapIn 类,这是一个抽象类,自定义的Snapin需要继承它。Name是自定义的Snapin的名称,Verdor是作者,Description是对该Snapin的简短描述。

 

 1     [RunInstaller(true)]
 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 表示是位置参数,这样就可以根据位置来自动推断参数。

 

 1     [Cmdlet(VerbsCommon.New, "Excel")]
 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等系统中,执行部署、流程控制、自动化操作等。

posted @ 2012-01-15 12:17  徐州瑞步科技  阅读(2036)  评论(2编辑  收藏  举报