在茫茫人海中,同样是高中生,同乘7点50分的电车,看着同一片海⋯⋯那个瞬间不就是如奇迹般的邂逅吗。 收藏本站
登陆 / 注册 搜索

阅读:1.1万   回复: 3

PowerShell入门(结)编写PowerShell管理单元和二进制模块(转)

[复制链接]
soarcloud 「龙战于野」 2016-8-5 17:51 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

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

🤙🌦🔪🚭🐻‍



上一篇
下一篇
帖子热度 1.1万 ℃
soarcloud殷勤地给楼主揉揉肩捶捶背,楼主奖励2 个 金币.

锁上的光 「出类拔萃」 2018-5-5 16:23 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

听君一席话,省我十本书!
站在记忆的边缘 「出类拔萃」 2018-5-13 19:39 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

这是一个神奇的年代 小学生自称神和魔 初中生自称宫和朕 高中生自称哥爷爸 大学生自称宝宝#y450:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表