我对普通的人类没有兴趣,你们只要是有外星人、未来人、异世界人、超能力者, 就尽管来找我吧!以上! 收藏本站
登陆 / 注册 搜索

阅读: 9.4K   回复: 3

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

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

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

  PowerShell一开始就提出利用管理单元来实现自定义cmdlet,为大型软件系统提供有别于UI界面的脚本化管理方案。在PowerShell V2中,PowerShell管理单元还能以二进制模块的方式处理。5 ]2 G, U0 \$ ]: i* K8 r

: F$ b; {9 v6 T3 x( }! M7 k编写管理单元
) S  B  F$ p8 t) \9 v/ {+ y6 n  编写PowerShell管理单元需要依赖System.Management.Automation程序集;而System.Management.Automation程序集是Windows SDK的一部分,所以安装Windows SDK是编写PowerShell管理单元的先决条件。可以从这里下载Windows SDK。/ i: A5 [7 m9 j  @2 a. q
  作为编写PowerShell管理单元的准备,我们先打开VS2008或者VS2010,创建一个类库项目,目标.Net Framework版本选择3.5。简单编译通过之后,就可以编写cmdlet命令类和SnapIn安装类了。6 Q7 I5 B" _  Z: l
( v* D. p5 `2 S3 J9 C, @* @  I
编写cmdlet类
- `. h6 |- X1 J$ W  v* D; P+ E3 T  自定义cmdlet类有以下几个步骤:- b5 L% f. \+ E1 F6 v
  1、在项目中添加对System.Management.Automation程序集的引用(路径是C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll);并且添加相应命令空间的引用using
" {2 z8 m' |9 d& [& \; P* }2 QSystem.Management.Automation;
& Q" b) [, H8 _+ V, t  2、创建名为New-Addition的类,添加对命令空间System.Management.Automation的引用;
# k9 Q1 Z: }2 g  y  3、让New-Addition类继承自PSCmdlet,并给New-Addition类添加Cmdlet属性标记,设置动词和名词;* Z, f9 @8 O" n- \. D( K: N
  4、添加参数信息,参数一定要用Parameter属性标记;  X* D- y/ H2 w" E, ?0 v2 Y
  5、重载ProcessRecord函数,实现自己的业务逻辑;
; z5 f4 N3 K7 i/ p7 R; B8 V4 M4 K/ N4 V" d$ L- _
编写cmdlet类的示例如下(本文示例参考了Ivor Bright's blog):
% Y1 T- L  \7 O) u+ [2 T. W复制代码7 }4 b; O. w. T* b
using System;1 `) _1 U' H! `- j) p) G8 i$ p0 U3 d
using System.Management.Automation;2 }5 q1 q$ q+ f' |, _9 R

3 W3 A6 H$ `' p; p( ?5 Q% Z1 v/ unamespace PSSnapInDemo1
' ~4 r5 o5 K8 K; D{
  f* h  w/ P5 \3 c1 h    [Cmdlet(VerbsCommon.New, "Addition")]
! [" _$ s/ R: d7 x$ o    public class New_Addition: PSCmdlet
2 t* Z& @1 j( L7 \' A! ~    {
$ P( u/ s8 P5 N$ e3 J  V1 U' W/ T        [Alias("X")]
4 p4 K$ E4 z; |9 J7 p6 u. Z        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]" h, N& k  X8 d, v% U8 @6 X
        public int FirstParameter { get; set; }9 j5 A* j' e# a. z: k. j
) y  j9 T% F4 |( G2 j
        [Alias("Y")]9 g  l  P+ o1 ]9 O
        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]. t) i+ h- W! [  X
        public int SecondParameter { get; set; }
" Y& S4 t7 s' ]; E. @: a- W# ?! y  d1 f
        protected override void ProcessRecord()# U: E3 z9 v" ?! }/ K
        {
+ G0 D* t! D5 g0 u/ b# q% o6 H& L# |            WriteObject(string.Format("{0} + {1} = {2}", this.FirstParameter, this.SecondParameter,
' t2 O- V7 I* v4 T1 ~                this.FirstParameter + this.SecondParameter));
2 {; e- T% `  g3 x# O  p6 ^        }
) J* J" b+ ^4 R: D& c) T1 d# k# r    }- J: G: i! B: k  x0 [; D8 S
}: c6 \' @, m4 |" l, S
复制代码6 g! p3 B9 I* m3 A* F. a
编译通过后,自定义的cmdlet类就完成了,接下来就可以编写PSSnapIn安装类了。
4 w3 f# D8 v& |7 V6 s' c! f6 [/ h; n8 D& Z$ P' [
编写PSSnapIn安装类
; z+ x6 e+ @$ ]( y8 `4 m  编写PSSnapIn安装类的目的是使该类库能够被安装,并且被系统识别为PowerShell管理单元。步骤如下:
  B4 `. E6 S1 \6 u3 U9 Y9 |1 Z+ Y  o- ?' r) J+ T$ a6 ]
  1、添加对System.Configuration.Install程序集的引用;/ s* G% `. g; s
. o, s' c, o! k1 U1 x8 @) n
  2、创建名为PSSnapInInstaller的类,添加对命名空间System.ComponentModel和System.Management.Automation的引用;6 i  r5 Y/ y: L) [
" H7 {4 y& N2 z2 M5 F
  3、让PSSnapInInstaller类继承自PSSnapIn,并且以RunInstaller(true)属性标识它。0 u8 X" i9 g7 x; z

) d& S8 E- y7 Q) ?% f* ~  4、重载Name、Vendor和Description三个属性;8 u" b0 m# @& K* {7 m! @/ z

& D' ]4 h5 i. m% X: G& _% S0 w  c+ D示例如下:
; \) [( W% X  k$ U, _  P8 e- K3 m7 r* h8 U/ y4 j' [! _9 W  B: z
复制代码
7 S: l! U* t  P# tusing System;
6 y/ }0 c, u7 t& c7 r4 Nusing System.Management.Automation;% X' k& m9 K  k' f. i) c
using System.ComponentModel;
" V3 y+ L: l) l% ?# {* h1 J, X
0 d, H& e$ t( h; \namespace PSSnapInDemo1
$ E7 p9 g# d- b. d. _{
  U7 E5 Y* m5 \& P. C7 ^; o    [RunInstaller(true)]
0 E% n4 c, U  B# a3 `    public class PSSnapInInstaller : PSSnapIn- ^: X5 M# ~0 [& x! ~/ u
    {/ Q6 F5 x! T$ g9 T9 k% J: e& C
        public override string Description7 P; W$ n( S- K% |' H+ f
        {
& g$ G7 A1 t* A3 T            get { return "This is Luke's first Snap In demo"; }3 b& M% X. Q; k: j+ F% b
        }
9 b* U  |- n3 j
# y* S/ m6 k  h        public override string Name' U$ V  N2 S" [
        {
% b. N1 {. v! ?2 Q- N            get { return "PSSnapInDemo1"; }
( C$ J" }# [2 J; [  d1 U/ q        }
7 M/ Y8 ]1 Z& B" V; e8 o6 G
& g# y9 O+ }+ n        public override string Vendor  R& |- I1 K( s/ Q" i
        {: J9 f& o$ y7 c0 u, ?
            get { return "CaiJu"; }
0 E, l8 `* }5 f  `# g        }2 K2 H) m5 }# E5 P! ~
    }
/ ^8 `; b# b1 j9 P}
) i# H6 V# x: Z& Z* D复制代码( M- R: L! e  C3 Z% o9 s6 e0 C- [5 u
编译通过以后,PSSnapIn安装类也完成了,这样我们编写代码的工作就全部完成了。编译整个解决方案,生成类库文件。$ M' M9 x; G% L8 k; ~1 h

' a; j0 `6 e' n' i( d使用管理单元
- f1 t  W# V# a  n0 b7 n  C, @  编写好的管理单元,在使用之前需要先注册。注册流程如下:
' ?" Y7 d2 e0 Q9 }
$ |6 F- g" |" _6 E. K  R  1、打开Visual Studio自带的命名行,并且导航到PSSnapInDemo1.dll的目录中;
+ E8 }7 I  i; u9 \2 W; m: K1 x7 x* t3 H2 Y: W; U8 K4 B8 {
  2、执行“installUtil /i PSSnapInDemo1.dll”命令;
: _! T5 D# J6 }' y8 s" t* k+ G' q, i7 r$ o: C# J6 d" C0 [
如上命令如果成功执行,注册过程就完成了;如果不成功,请仔细检查安装过程的log文件。. T4 z/ {8 R! z. @

! ?# H- ^4 C( u" |& a! }* _1 ]  PowerShell管理单元注册成功后,就可以将其添加到当前会话中使用了。查找已经注册的PowerShell管理单元,可用以下命令:
) s; L2 ?2 t0 Q/ m' k! d% ~" \/ L4 S$ C* i
复制代码. r) C: S+ R1 p8 Z6 t5 t0 z6 J# I! z
PS C:\Users\luke> Get-PSSnapin -Registered | ft% V& [* Z( Y0 \$ A
, i! E" y* {+ ?# @4 A9 |1 U( {
Name                           PSVersion            Description' L0 }2 e8 `# _1 a8 _1 b
----                           ---------            -----------
- B" O  F% \  [PSSnapInDemo1                  2.0                  This is Luke's first Snap I...5 M2 @* M& m: y' C' ?1 ?) Y9 c; o
SqlServerCmdletSnapin100       2.0                  This is a PowerShell snap-i...& V. I5 r2 p# Z$ P6 a- p
SqlServerProviderSnapin100     2.0                  SQL Server Provider3 W% A5 t# W7 C3 {4 r1 k. P
复制代码! u) l0 U# I7 Q+ t0 O

1 x6 I3 I9 m% G& c0 P以上命令的输出结果已经显示出了我们刚刚注册的PowerShell管理单元,添加管理单元使用如下命令:/ Y1 g, {. H, L) C5 Y& i, m3 Z3 C

' x( p4 W5 ^1 Z/ S" p! [PS C:\Users\luke> Add-PSSnapin -Name PSSnapInDemo1
/ [1 y2 J6 Y" N! e
/ Z! f" r1 b5 h0 q1 w7 |PowerShell管理单元添加成功后,就可以使用其中的命令了,使用方法与使用系统自带的cmdlet命令相同。0 J- x( g) K# B7 i9 t

! ^: u% r: O/ |5 M  h$ h编写二进制模块! R3 o( G% o" K7 Z9 Y- y
  编写二进制模块的编写与编写管理单元的方法基本相同,都需要实现cmdlet类,但它不需要实现安装类。具体方法参见上述编写cmdlet类的步骤。需要说明的是,同时实现了PSSnapIn类的类库,仍然可以当作二进制模块来使用。也就是说,PowerShell管理单元的程序集文件,可以不加修改的当成二进制模块的程序集来使用。
+ n, M9 f( Y7 O1 m$ m1 b. [. I. D& A& ]  S) r& j
使用二进制模块' ~# _8 }9 \( B
  二进制模块的使用与PowerShell入门(十一):编写脚本模块中脚本模块的使用方法相同,即在搜索目录下创建同名文件夹,并将程序集拷贝进去,可选创建描述文件等;然后查找和导入模块。之后,二进制模块中的命令就可以使用了。  B: U# G6 l' D5 G3 A' E

, j- l7 f7 F( L0 a* X# A0 P3 ^结语' s5 P4 y3 Z5 ^
  除了自定义cmdlet外,PowerShell管理单元还可以编写自定义提供程序。提供程序是一个更高级别的概念,系统预定义的有文件系统、注册表和证书等。不过,PowerShell管理单元中不能定义别名和变量,如果你需要这些功能,可以选择使用脚本模块。
- N: D4 Y- S0 @! B  n: Y
) q& e$ F+ s$ g/ y
2 b: A3 ^/ o8 {; W' r+ _
上一篇
下一篇
soarcloud殷勤地给楼主揉揉肩捶捶背,楼主奖励2 个 金币.


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

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

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

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

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

本版积分规则

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

GMT+8, 2021-10-27 14:01 , Processed in 0.020223 second(s), 19 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表