转至:http://www.cnblogs.com/ceachy/archive/2013/03/13/PowerShell_SnapIn.html

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管理单元中不能定义别名和变量,如果你需要这些功能,可以选择使用脚本模块。

【转】PowerShell入门(十二):编写PowerShell管理单元和二进制模块的更多相关文章

  1. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  2. 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...

  3. 【转】PowerShell入门(二):PowerShell是Cmd命令行的加强版吗?

    转至:http://www.cnblogs.com/ceachy/archive/2013/01/31/PowerShell_vs_Cmd.html PowerShell是命令行的加强版吗?Power ...

  4. SpringBoot入门 (十二) 定时任务

    本文记录在SpringBoot中使用定时任务. 在我们的项目中,经常需要用到定时任务去帮我们做一些事情,比如服务状态监控,业务数据状态的更改等,SpringBoot中实现定时任务有2中方案,一种是自带 ...

  5. Redis教程(十二):服务器管理命令总结

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/140.html 一.概述: Redis在设计之初就被定义为长时间不间断运行 ...

  6. ES6入门十二:Module(模块化)

    webpack4打包配置babel7转码ES6 Module语法与API的使用 import() Module加载实现原理 Commonjs规范的模块与ES6模块的差异 ES6模块与Nodejs模块相 ...

  7. java web开发入门十二(idea创建maven SSM项目需要解决的问题)基于intellig idea(2019-11-09 11:23)

    一.spring mvc action返回string带双引号问题 解决方法: 在springmvc.xml中添加字符串解析器 <!-- 注册string和json解析适配器 --> &l ...

  8. springcloud(十二)-springcloud-config统一管理微服务配置

    1.为什么要统一管理微服务配置 对于传统的单体应用,常使用配置文件管理所有配置.例如一个SpringBoot开发的单体应用,可将配置内容放在application.yml文件中.如果需要切换环境,可设 ...

  9. ballerina 学习 三十二 编写安全的程序

      ballerina编译器已经集成了部分安全检测,在编译时可以帮助我们生成错误提示,同时ballerina 标准库 已经对于常见漏洞高发的地方做了很好的处理,当我们编写了有安全隐患的代码,编译器就已 ...

随机推荐

  1. 利用OTP为odoo增强安全访问

    两次验证是广泛应用于各大站点的验证机制,我们今天利用Google Authentication来实现Odoo的两次验证,防止撞库或密码泄露等引起的安全问题. 1. 二次验证的原理 参见 http:// ...

  2. seajs实现JavaScript 的 模块开发及按模块加载

    seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http:/ ...

  3. android——利用SharedPreference做引导界面

    很久以前就接触过sharedPreference这个android中的存储介质.但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来 ...

  4. springboot+dubbo

    使用springboot搭建dubbo服务,首先封装出springboot-dubbo的项目,引入在服务上加直接@Service直接使用,方便于拆封统一管理. package hello.dubbo. ...

  5. 中科院开源协会镜像站 Android SDK镜像

    中科院开源协会镜像站 Android SDK镜像测试发布 https://forum.opencas.org/t/184

  6. php 常见问题

    empty(trim($str))报错原因 一个if判断如下: if (!empty(trim($a))) { ... } 报出如下错误: Fatal error: Can't use functio ...

  7. [archlinux][hardware] ThankPad T450自带SSD做bcache之后的使用寿命分析

    这个分析的起因,是由于我之前干了这两个事: [troubleshoot][archlinux][bcache] 修改linux文件系统 / 分区方案 / 做混合硬盘 / 系统转生大!手!术!(调整底层 ...

  8. ajax返回json在 IE下,提示打开或保存的解决方法

    Content-type要设置成 text/html 我是用的mvc jquery.form.js 提交的表单. 返回json响应数据. 结果在ie下提示打开或保存,查看保存的内容.就是我返回的jso ...

  9. LeetCode Find All Numbers Disappeared in an Array

    原题链接在这里:https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/ 题目: Given an array o ...

  10. RHEL6.5 换源

    由于redhat的yum在线更新要收费,即没有注册的无法使用:将redhat的yum卸载.重装第三方源. 第三方源包括:网易,重庆大学,epel 等Author wood_man.2015.10.2 ...