您的位置:首页 > 运维架构 > Shell

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

2012-01-15 12:17 274 查看
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的简短描述。

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";
}
}

// Vendor information for the PowerShell snap-in.
public override string Vendor
{
get
{
return "Brooks";
}
}

// Description of the PowerShell snap-in
public override string Description
{
get
{
return "This is a sample PowerShell snap-in";
}
}
}

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 {
get
{
return this.__Path;
}
set
{
this.__Path = value;
}
}

[Parameter(Mandatory = true, Position = 2)]
public Excel.XlFileFormat Format
{
get
{
return this.__Format;
}
set
{
this.__Format = value;
}
}

protected override void BeginProcessing()
{
base.BeginProcessing();
}

protected override void ProcessRecord()
{
Excel.Application __app = new Excel.Application();
__app.DisplayAlerts = false;
Excel.Workbook __book = __app.Workbooks.Add();
try
{
__book.SaveAs(this.Path, this.Format);
}
catch
{ }
finally
{
__app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(__book);
System.Runtime.InteropServices.Marshal.ReleaseComObject(__app);
__book = null;
__app = null;
}
}

protected override void EndProcessing()
{
base.EndProcessing();
}
}

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等系统中,执行部署、流程控制、自动化操作等。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: