倘若只是为了驱赶心中的寂寞,找谁都可以的。 收藏本站
登陆 / 注册 搜索

阅读: 8.7K   回复: 3

[# 系统基础] PowerShell入门(结)编写PowerShell管理单元和二进制模块(转)

soarcloud 「龙战于野」 2016-8-5 17:51 |显示全部楼层

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

  PowerShell一开始就提出利用管理单元来实现自定义cmdlet,为大型软件系统提供有别于UI界面的脚本化管理方案。在PowerShell V2中,PowerShell管理单元还能以二进制模块的方式处理。
0 M$ k* J; p, e) L) V, L, j. p/ C4 C/ s
编写管理单元
) [4 P# Q6 L' c  _0 `  编写PowerShell管理单元需要依赖System.Management.Automation程序集;而System.Management.Automation程序集是Windows SDK的一部分,所以安装Windows SDK是编写PowerShell管理单元的先决条件。可以从这里下载Windows SDK。
* d' W% U: ?! _, {  作为编写PowerShell管理单元的准备,我们先打开VS2008或者VS2010,创建一个类库项目,目标.Net Framework版本选择3.5。简单编译通过之后,就可以编写cmdlet命令类和SnapIn安装类了。% o0 y  v8 ]  u8 L0 C) Z5 {
' f; ^& f+ C4 }# V
编写cmdlet类
: \" Q. ^$ _7 I  自定义cmdlet类有以下几个步骤:) e0 A+ O& p! }7 U  [; x. @3 s
  1、在项目中添加对System.Management.Automation程序集的引用(路径是C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll);并且添加相应命令空间的引用using 4 Y; C5 G4 T/ j. H, J* v
System.Management.Automation;
% t4 s. x6 d; j/ I& i  2、创建名为New-Addition的类,添加对命令空间System.Management.Automation的引用;! n2 q8 B9 s6 i0 d/ L7 t
  3、让New-Addition类继承自PSCmdlet,并给New-Addition类添加Cmdlet属性标记,设置动词和名词;
, ?  S4 p+ L- `, s  4、添加参数信息,参数一定要用Parameter属性标记;
3 T2 e" T1 b# H" K% P- o" _, Q  5、重载ProcessRecord函数,实现自己的业务逻辑;' b; N4 `7 x/ L0 e2 c, Z$ E
3 ?" N3 Z6 h0 E# r
编写cmdlet类的示例如下(本文示例参考了Ivor Bright's blog):
9 m/ R! g2 W6 h7 i复制代码
) ~5 _* V, U2 k0 R; H( ?4 zusing System;
' }) H6 X: h8 i, l( R  ^using System.Management.Automation;
, G" X! W4 ^9 z6 ^# G/ r. v  S# d
7 a: \; x( Y: Q* b. T, N4 R/ Lnamespace PSSnapInDemo18 g) b: U* N8 z
{
8 @1 [0 O' T0 E8 E( |0 M  P5 n    [Cmdlet(VerbsCommon.New, "Addition")]
. ^" u, I8 j( \! T6 h  f) u    public class New_Addition: PSCmdlet' y9 y4 R# ?$ f" W/ i
    {
: u: C' a  C% z3 z        [Alias("X")]1 o8 J. M% {% X4 O" v, D2 B
        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]
2 I  `- V* O7 s( U        public int FirstParameter { get; set; }9 U  J: }( ?( E' j/ i' S/ S
: _* u& g) n4 s! C+ n
        [Alias("Y")]
' c$ p% K0 B6 \4 n; E  N& w( l; P        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]
% T8 z5 W  E, l% F, U; ^        public int SecondParameter { get; set; }* w3 d7 t* P" ?8 H( A# s7 y

8 T* Q+ Y! N- Z1 F        protected override void ProcessRecord()
$ g/ c/ e2 \7 T9 v5 g0 M        {6 }6 T1 t1 t+ C% ~5 b
            WriteObject(string.Format("{0} + {1} = {2}", this.FirstParameter, this.SecondParameter,
0 D# o& h$ e5 u                this.FirstParameter + this.SecondParameter));' P2 O3 ~$ z, _8 {! d& O0 [
        }8 _; d# o" h+ @) a
    }
7 N, K' K& Z; D' P" S1 k) {}
! R; ~6 h! z+ I2 g( `, I8 ?7 b复制代码
( W2 Q' `$ b7 S  D7 }. o6 f% H编译通过后,自定义的cmdlet类就完成了,接下来就可以编写PSSnapIn安装类了。
" t0 ~& k5 c8 b* F- @! B
& i  F: K' j5 l编写PSSnapIn安装类
$ s. Q, w# a, E& H/ G8 |  编写PSSnapIn安装类的目的是使该类库能够被安装,并且被系统识别为PowerShell管理单元。步骤如下:
( a: [/ @, g9 I( N) {" l. c% k, i% d& S; X# l
  1、添加对System.Configuration.Install程序集的引用;' y5 A) @1 L3 I( D0 s9 X  U- r
- V/ j7 }/ ]0 d
  2、创建名为PSSnapInInstaller的类,添加对命名空间System.ComponentModel和System.Management.Automation的引用;" o/ ]0 P9 x1 Z' O

, V1 N8 C# M5 {  3、让PSSnapInInstaller类继承自PSSnapIn,并且以RunInstaller(true)属性标识它。
; Y; q: Z2 @1 P. H8 F% s: J; h0 ^( E7 \8 x0 A: Y# \
  4、重载Name、Vendor和Description三个属性;
' N" |6 _/ O6 A
7 J! s6 k# o% F: t, E  A( c示例如下:
% X/ z* r- {" H) h) u/ @: {, t6 z& e8 M7 B4 W* q5 N- l% g( r
复制代码0 ~2 [0 ]+ g  R& S0 R6 ?
using System;* t; F8 l4 y3 ~4 Q8 x0 o0 S( O7 W
using System.Management.Automation;
3 \$ t# H- s2 o8 l% m  Uusing System.ComponentModel;
* i* e2 q5 [# r7 ~( ?8 `
, |) ?& `" u7 i9 Znamespace PSSnapInDemo1
7 t, ~" z, W5 b! t7 p5 a0 [{! E: m$ F# R: s5 S* H
    [RunInstaller(true)]
, M( g! {7 H( o4 z8 j) y( K: e3 E' M    public class PSSnapInInstaller : PSSnapIn1 r! J6 u& D9 r$ m
    {, ?1 Y& |' T* i
        public override string Description
  F" `: i4 ?, d* w        {
: ?; Z  ?1 A0 g            get { return "This is Luke's first Snap In demo"; }' a( p. K+ T/ K  g
        }
: J* B6 I0 F7 S3 f5 h6 Q2 E# s% X: @( y. _7 }" A& c) K0 A
        public override string Name( N0 _! e3 b8 w  C' a* `
        {  L& G# c) V+ @' p
            get { return "PSSnapInDemo1"; }3 G0 B+ v: A. B2 q/ t
        }
3 X& n& p/ _7 T0 R% i1 l  P9 [6 t/ X( j7 i
        public override string Vendor
4 E4 e5 x6 o* _: e; [        {
0 q/ i6 k: A  b& U' x0 |            get { return "CaiJu"; }0 R4 D: j8 n1 q% c# O! k& k
        }
8 S) h' N  d; o7 V6 U6 H    }
0 `' V, Z' p0 }5 I. _}
7 S9 m; r# E9 D, Z! }9 T/ v* }复制代码6 H9 ]+ B7 G1 h. B" e, W& ]( H) T
编译通过以后,PSSnapIn安装类也完成了,这样我们编写代码的工作就全部完成了。编译整个解决方案,生成类库文件。$ ?* ]8 g) ~1 g

- t: t$ r5 A" h) Z4 R使用管理单元
4 j, z5 @( y3 L) n8 T- n8 z' |. }3 |3 }  编写好的管理单元,在使用之前需要先注册。注册流程如下:; |, e- ~' f: t: a3 y% C
3 O0 W% ~4 R0 d4 }" D  |6 M
  1、打开Visual Studio自带的命名行,并且导航到PSSnapInDemo1.dll的目录中;+ E7 [% M% k! X

) Y- Y- {0 z3 `  2、执行“installUtil /i PSSnapInDemo1.dll”命令;
  K; x7 @* U" u0 H- z# W1 y8 b
, K4 V, }$ q# @3 X" _如上命令如果成功执行,注册过程就完成了;如果不成功,请仔细检查安装过程的log文件。
( O+ Z1 ]2 X" F" E* j+ y# c$ ?+ `
  PowerShell管理单元注册成功后,就可以将其添加到当前会话中使用了。查找已经注册的PowerShell管理单元,可用以下命令:1 a: }! H; Q# B  F

) ]4 U! r/ B$ J/ F/ A复制代码
; R" G6 \. `9 f* fPS C:\Users\luke> Get-PSSnapin -Registered | ft
4 X- b5 e* A' ^& D& [: g* u4 s# J( |2 J1 h
Name                           PSVersion            Description  T9 O/ K! \, s6 A
----                           ---------            -----------
0 }, v$ E- X9 s0 \5 FPSSnapInDemo1                  2.0                  This is Luke's first Snap I...9 c5 i% m% R& F- M! E
SqlServerCmdletSnapin100       2.0                  This is a PowerShell snap-i...
" C+ z, }6 D, k! R7 ~% ?+ CSqlServerProviderSnapin100     2.0                  SQL Server Provider
7 |7 r: k/ u3 d! t. E. g+ l! \. [复制代码1 x0 [0 B& N5 M. E

" ?5 H* y" ?" Y( l: u( N5 F- X4 \以上命令的输出结果已经显示出了我们刚刚注册的PowerShell管理单元,添加管理单元使用如下命令:
, d$ ?' O1 W/ ^  g, v: t0 D
/ f8 Z# v# [) e* V/ ePS C:\Users\luke> Add-PSSnapin -Name PSSnapInDemo1
/ |* a7 t4 k0 f% n/ s
! a# I2 p" a8 \0 y& PPowerShell管理单元添加成功后,就可以使用其中的命令了,使用方法与使用系统自带的cmdlet命令相同。
8 `% K) H( Q' l4 W" a5 d3 j! p/ \1 g& E( H* a5 z* }3 c' t
编写二进制模块
$ N: y% ^. E7 i5 I9 D) w  编写二进制模块的编写与编写管理单元的方法基本相同,都需要实现cmdlet类,但它不需要实现安装类。具体方法参见上述编写cmdlet类的步骤。需要说明的是,同时实现了PSSnapIn类的类库,仍然可以当作二进制模块来使用。也就是说,PowerShell管理单元的程序集文件,可以不加修改的当成二进制模块的程序集来使用。
/ i  B; `/ K4 q; R/ G- `4 ?5 F7 i, v' x3 i
使用二进制模块
. B9 u4 i% i, k" D' d) @4 U  二进制模块的使用与PowerShell入门(十一):编写脚本模块中脚本模块的使用方法相同,即在搜索目录下创建同名文件夹,并将程序集拷贝进去,可选创建描述文件等;然后查找和导入模块。之后,二进制模块中的命令就可以使用了。
! q3 _/ Q% J, l9 w) N6 y) A* ^' F% E& i/ P7 ^
结语
( D; K, s" r' a4 k  除了自定义cmdlet外,PowerShell管理单元还可以编写自定义提供程序。提供程序是一个更高级别的概念,系统预定义的有文件系统、注册表和证书等。不过,PowerShell管理单元中不能定义别名和变量,如果你需要这些功能,可以选择使用脚本模块。$ N. G$ x8 A- p

0 N  J& X6 |( B; P9 K6 {% d
& Q& v+ I0 Z9 [- u9 e2 o" c
上一篇
下一篇
soarcloud殷勤地给楼主揉揉肩捶捶背,楼主奖励2 个 金币.


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

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

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

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

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

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2021-4-12 05:06 , Processed in 0.029817 second(s), 24 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表