天空本是一种风景,可是遇见你之后,它变成了一种心情。 收藏本站
登陆 / 注册 搜索

阅读: 8.4K   回复: 3

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

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

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

  PowerShell一开始就提出利用管理单元来实现自定义cmdlet,为大型软件系统提供有别于UI界面的脚本化管理方案。在PowerShell V2中,PowerShell管理单元还能以二进制模块的方式处理。' x9 d3 D' Z, q8 _9 R0 F, R

2 }5 P) V  f  V3 S% D编写管理单元' F+ @( P5 {" j9 P( w- ]" R
  编写PowerShell管理单元需要依赖System.Management.Automation程序集;而System.Management.Automation程序集是Windows SDK的一部分,所以安装Windows SDK是编写PowerShell管理单元的先决条件。可以从这里下载Windows SDK。2 [; e  [* U9 f9 }; u
  作为编写PowerShell管理单元的准备,我们先打开VS2008或者VS2010,创建一个类库项目,目标.Net Framework版本选择3.5。简单编译通过之后,就可以编写cmdlet命令类和SnapIn安装类了。
- [$ z8 B( |" ]  E. U0 U* ?
$ b4 |- D( ~- {编写cmdlet类! y- V0 @, U+ I, ?, l7 N+ ~
  自定义cmdlet类有以下几个步骤:
) n: T, g  P7 h) j; o  1、在项目中添加对System.Management.Automation程序集的引用(路径是C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll);并且添加相应命令空间的引用using " a  v2 K) D9 s' _' Q
System.Management.Automation;7 c" ]7 E6 X$ m
  2、创建名为New-Addition的类,添加对命令空间System.Management.Automation的引用;8 @+ E& g9 A. i8 I* b+ E2 [
  3、让New-Addition类继承自PSCmdlet,并给New-Addition类添加Cmdlet属性标记,设置动词和名词;
& W- Q: a  a$ P3 q  4、添加参数信息,参数一定要用Parameter属性标记;/ V9 T( Z5 V, j& C* G3 V
  5、重载ProcessRecord函数,实现自己的业务逻辑;
$ Y. P# ~( p! o1 S; y  r5 j. \/ @5 g/ o" E
- K- {, v# m! D6 }编写cmdlet类的示例如下(本文示例参考了Ivor Bright's blog):0 j, a9 y4 U; K2 j8 a3 M
复制代码
% `- R) k0 F8 \! h: `using System;
- a2 S9 c; Q1 n& Uusing System.Management.Automation;
  u2 Z) k' Y5 k
/ \3 {6 e0 i" V( H; R, j/ snamespace PSSnapInDemo18 k/ v3 _- j1 f
{
5 b" {$ x# ^2 @    [Cmdlet(VerbsCommon.New, "Addition")]
: K4 n& O1 k- b    public class New_Addition: PSCmdlet. m+ E7 V& B+ w' e
    {. y$ W5 d4 e) _  Q7 V% D% O. E" m0 o
        [Alias("X")]: @/ ?+ [+ d6 w$ q6 M- n! X
        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]
; v; L% e" A7 Y# ?        public int FirstParameter { get; set; }
/ b9 f- ]% k! _9 L) f3 n% X
! k3 i: B3 E) q) v2 p        [Alias("Y")]
- u6 w! U' S, C+ E        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]6 O, p1 i" i, R. ~3 o7 I1 u, y
        public int SecondParameter { get; set; }
! G8 D6 ^+ F4 O) E0 l# Q/ z1 D8 c- D1 v# J+ ^3 ]: t
        protected override void ProcessRecord()
/ A' y" @* X) b: p: Q        {
3 n& A  w8 {7 M            WriteObject(string.Format("{0} + {1} = {2}", this.FirstParameter, this.SecondParameter,
; G9 `" Y- `& t, f                this.FirstParameter + this.SecondParameter));
: Z! H$ m" p+ m! @$ [        }
+ L/ L& @! ~1 y& F1 q    }3 ?1 n) Z3 g- e1 @/ M
}2 D/ Y" n2 s2 v# c4 U+ u+ ]
复制代码$ b+ G! |. q% G
编译通过后,自定义的cmdlet类就完成了,接下来就可以编写PSSnapIn安装类了。: y, N% @2 c  L
# D& W: u0 d: f  I1 \7 K  s5 T
编写PSSnapIn安装类
4 k- O: ]6 m+ S2 W  @# w% z  编写PSSnapIn安装类的目的是使该类库能够被安装,并且被系统识别为PowerShell管理单元。步骤如下:
! I- s) v0 ^& Y0 {- m9 t1 s  h+ E+ t. E" M1 V2 [6 n+ m
  1、添加对System.Configuration.Install程序集的引用;3 z7 e. L# ~  }( |0 ~2 F6 G

! w% K6 ~% L2 I  2、创建名为PSSnapInInstaller的类,添加对命名空间System.ComponentModel和System.Management.Automation的引用;
; C3 C8 a& V8 e# k4 ]* v9 k: d6 R# @6 @0 A
  3、让PSSnapInInstaller类继承自PSSnapIn,并且以RunInstaller(true)属性标识它。
9 C" w3 f( U# j3 u# [1 p9 g( L5 \$ V
  4、重载Name、Vendor和Description三个属性;. Z1 S- V4 O  `" B# P6 x. t

4 N" l% U! {1 G' b% V  ^示例如下:/ R' J! b& E  D: Y1 q7 A

) q: B- {9 b, p" @! C0 t9 ]4 {复制代码! h6 Q6 \& f% g3 P1 M. |: w" U4 r
using System;
0 g' G, B$ |" l6 _using System.Management.Automation;
' g9 z, G0 q, ~) i4 Uusing System.ComponentModel;
9 h: y9 v% ^4 g8 ^; H
! H& e. C" |/ E2 r" f8 }namespace PSSnapInDemo1) W( O4 Q, u9 H4 I
{+ L- i7 q6 B4 C
    [RunInstaller(true)]0 s5 ^- D. {, p
    public class PSSnapInInstaller : PSSnapIn
8 \4 J2 _5 b5 ~0 ?    {
# k' W7 A1 m! f, B3 ^4 p        public override string Description
2 p% ?2 B0 J9 [3 M        {
/ P, Z' L2 v& N! S  {3 u3 m            get { return "This is Luke's first Snap In demo"; }2 W  D& p$ {# o
        }# X! ?$ \4 m, y. Z/ f9 W
/ c7 N. ^( M" U2 ]" `# e; S
        public override string Name: I: F( V& l1 u1 x9 t1 z  s
        {* O; W4 ~0 P! s6 F
            get { return "PSSnapInDemo1"; }
8 u4 v3 O. j  D' U2 L, V8 J        }. E( ^9 h' N( G; r8 O" M# X) e
. N( N  p) b$ g7 `" I
        public override string Vendor, m( M- R) U, D2 }- X2 Q9 U4 {
        {
. h9 U& V6 ?6 i# v8 _            get { return "CaiJu"; }" h) K( R' ^/ X" \) u/ b
        }
' s# n% g# x3 B, a, l1 H    }
* |: [5 \. o% _$ m* e}/ T. v- u6 h$ L, D/ S$ m
复制代码" v3 [. [! g: N2 n% p
编译通过以后,PSSnapIn安装类也完成了,这样我们编写代码的工作就全部完成了。编译整个解决方案,生成类库文件。0 n8 X4 |* ]8 |7 q: Y4 ^
, h$ u+ i( x4 D# J  Q- x; n
使用管理单元
, L7 k- \4 l8 R. P3 C  编写好的管理单元,在使用之前需要先注册。注册流程如下:
4 j; t( E" I% q6 f/ q: Z# k1 T0 v, D/ b  \- a
  1、打开Visual Studio自带的命名行,并且导航到PSSnapInDemo1.dll的目录中;8 K7 L' |( f, J

5 G% I/ n( y0 g# D0 _3 s: R  2、执行“installUtil /i PSSnapInDemo1.dll”命令;4 P6 c& i+ J7 }$ B6 i5 a" g4 S

2 h, c. M/ d1 T9 V如上命令如果成功执行,注册过程就完成了;如果不成功,请仔细检查安装过程的log文件。
2 v; }' ~% E9 z) ?+ |! N
6 t: ^3 t8 @+ B; ?! ^  PowerShell管理单元注册成功后,就可以将其添加到当前会话中使用了。查找已经注册的PowerShell管理单元,可用以下命令:
% g0 r5 k: f: q/ @( _+ c7 q* d& a1 s$ v& H9 b( L
复制代码
" \6 u: B7 W! mPS C:\Users\luke> Get-PSSnapin -Registered | ft% C/ B/ [* V) D" U/ {4 z

; a6 w/ t8 v& P7 q# _" x. q% DName                           PSVersion            Description
7 O# R# n  `" [% c----                           ---------            -----------" W* M  J/ k' a! u
PSSnapInDemo1                  2.0                  This is Luke's first Snap I...8 y8 [: x; ?1 g2 H) k
SqlServerCmdletSnapin100       2.0                  This is a PowerShell snap-i...  x( P: t6 h* z, q6 |& G
SqlServerProviderSnapin100     2.0                  SQL Server Provider
: W: X- Q9 v( E  b" a复制代码  Q; u( v3 z: l0 X7 }; {

! K, ]; _9 d3 E9 \以上命令的输出结果已经显示出了我们刚刚注册的PowerShell管理单元,添加管理单元使用如下命令:( i4 G; O2 {0 \9 i& ]  J4 z9 U
8 _4 ]. X- h+ Z; T
PS C:\Users\luke> Add-PSSnapin -Name PSSnapInDemo1, ~0 O, X+ B$ l" e
( ~9 e3 ]. w, d5 E+ ]) L0 w1 ]
PowerShell管理单元添加成功后,就可以使用其中的命令了,使用方法与使用系统自带的cmdlet命令相同。
9 J- x/ \" X3 O* C3 E
1 s. B8 w/ j* F! L) [+ ]2 _* X8 k编写二进制模块
$ p+ S9 @" T( ]- ]  编写二进制模块的编写与编写管理单元的方法基本相同,都需要实现cmdlet类,但它不需要实现安装类。具体方法参见上述编写cmdlet类的步骤。需要说明的是,同时实现了PSSnapIn类的类库,仍然可以当作二进制模块来使用。也就是说,PowerShell管理单元的程序集文件,可以不加修改的当成二进制模块的程序集来使用。
- \9 B+ p' K7 U! e1 w& Q4 Z+ ~* [: |6 b/ Z
使用二进制模块
5 e2 ~# b2 d0 ?' K& q  二进制模块的使用与PowerShell入门(十一):编写脚本模块中脚本模块的使用方法相同,即在搜索目录下创建同名文件夹,并将程序集拷贝进去,可选创建描述文件等;然后查找和导入模块。之后,二进制模块中的命令就可以使用了。$ k5 r( K2 F6 b$ I) z
( F- y/ x6 w/ Z! T# L! E+ `& W
结语
& p. ~4 [$ d' j. Q  v: k* `  除了自定义cmdlet外,PowerShell管理单元还可以编写自定义提供程序。提供程序是一个更高级别的概念,系统预定义的有文件系统、注册表和证书等。不过,PowerShell管理单元中不能定义别名和变量,如果你需要这些功能,可以选择使用脚本模块。
4 ?4 s2 n& D6 Y: K+ C0 `' e  S  I6 M, S' }3 n
. q; ^6 G3 P5 R4 }4 |  `; o5 }( b


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

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

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

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

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

本版积分规则

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

GMT+8, 2020-9-24 21:40 , Processed in 0.100848 second(s), 22 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表