我的腿让我停下,可是心却不允许我那么做。 收藏本站
登陆 / 注册 搜索

阅读: 8.9K   回复: 3

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

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

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

  PowerShell一开始就提出利用管理单元来实现自定义cmdlet,为大型软件系统提供有别于UI界面的脚本化管理方案。在PowerShell V2中,PowerShell管理单元还能以二进制模块的方式处理。# J( [$ v+ i! j7 J4 A# l' q

% N/ T8 L; \2 L2 \  G& W% `编写管理单元
6 j. V7 J5 j8 D4 n" B* t( x0 W  编写PowerShell管理单元需要依赖System.Management.Automation程序集;而System.Management.Automation程序集是Windows SDK的一部分,所以安装Windows SDK是编写PowerShell管理单元的先决条件。可以从这里下载Windows SDK。) e% l0 q3 j( T
  作为编写PowerShell管理单元的准备,我们先打开VS2008或者VS2010,创建一个类库项目,目标.Net Framework版本选择3.5。简单编译通过之后,就可以编写cmdlet命令类和SnapIn安装类了。
, r5 T" b" N  K( Q4 y" r& D0 t
- g' w! q3 b) U: n5 Q+ x; p! _' u编写cmdlet类7 S. o) M! i& c& M
  自定义cmdlet类有以下几个步骤:
" Z7 F* k. V/ i5 C" k  1、在项目中添加对System.Management.Automation程序集的引用(路径是C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll);并且添加相应命令空间的引用using
) e: Z( x/ z8 c+ ^4 d* E/ f2 _7 e7 {System.Management.Automation;
: N( ?$ O1 |" @0 H* V, y  2、创建名为New-Addition的类,添加对命令空间System.Management.Automation的引用;: t7 \( P6 M3 w' i& c8 J  c9 R
  3、让New-Addition类继承自PSCmdlet,并给New-Addition类添加Cmdlet属性标记,设置动词和名词;
% Z3 [" e! n6 |' l2 q  4、添加参数信息,参数一定要用Parameter属性标记;
/ v; J0 F' r& L: G" B# L  5、重载ProcessRecord函数,实现自己的业务逻辑;& q. F8 j; Y( y3 x
+ O" j* ?- `- i1 R4 |6 g
编写cmdlet类的示例如下(本文示例参考了Ivor Bright's blog):3 G$ J; Y! ?4 a4 B% b8 R
复制代码
( r" B; r  _1 \using System;$ F3 T- b; Y$ Z. k/ M; \
using System.Management.Automation;, u  }. B" b  v

# h5 B2 w9 e# x! e3 Onamespace PSSnapInDemo1
, G8 D/ L# V% B' i{
0 K/ u" H' P( x+ I, f7 ]8 U/ k- y5 d    [Cmdlet(VerbsCommon.New, "Addition")]
5 F$ L9 u* W. K0 Z( Y    public class New_Addition: PSCmdlet9 a& a7 W6 n; ^8 e
    {6 C7 S: ~5 A% E
        [Alias("X")]' o9 Q0 e  B0 T& T
        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]. Q" @; X0 O% V2 {  @
        public int FirstParameter { get; set; }
5 x6 v5 T6 g) q) z0 K4 ]# R( X! u  S# I& ]+ L( R
        [Alias("Y")]3 j9 c2 U5 }6 C- [" ^( ^
        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]
' O$ I3 Q$ Q9 G1 Y        public int SecondParameter { get; set; }: E! k) U/ D. v; v
! m8 B0 k4 m4 x% h; S# ]. p5 Z+ j
        protected override void ProcessRecord()$ c- {9 r9 S7 d8 O
        {
/ M0 v; Q0 V" w3 b4 J' O* O            WriteObject(string.Format("{0} + {1} = {2}", this.FirstParameter, this.SecondParameter, . X  U7 M4 V% d# J) F' [
                this.FirstParameter + this.SecondParameter));
7 W5 d/ Y  I' a9 e$ x        }
0 P; e, r2 }2 O( B, ~; _. {* c    }0 H. J( E6 @) k; M8 a  C/ s
}3 h. x2 I. F( d* S, M( [! }7 ]' M
复制代码
( F9 h/ L* C7 m6 ^编译通过后,自定义的cmdlet类就完成了,接下来就可以编写PSSnapIn安装类了。
5 I" i/ k  w6 s1 F4 H  Z2 L. @. h$ l; J- L8 T$ P
编写PSSnapIn安装类0 @( T( D) w3 }- K* ?! d- t
  编写PSSnapIn安装类的目的是使该类库能够被安装,并且被系统识别为PowerShell管理单元。步骤如下:4 L6 o" Y+ s8 b- v; |
8 S2 p2 B# a* N/ G& f! i0 T/ L
  1、添加对System.Configuration.Install程序集的引用;
0 F3 t& X2 [' j' c7 }& }: N9 s) |: f3 W* b. a, n
  2、创建名为PSSnapInInstaller的类,添加对命名空间System.ComponentModel和System.Management.Automation的引用;$ u5 h+ L# I8 \- V$ W

: F" t7 V$ t( t! f. M* u3 r+ {3 v  3、让PSSnapInInstaller类继承自PSSnapIn,并且以RunInstaller(true)属性标识它。/ g; F! ~3 t. Z9 u' p2 [2 A+ t
5 A8 k7 ^1 w9 @6 I* ~6 `- `
  4、重载Name、Vendor和Description三个属性;- d, K$ R2 b- p1 G# u, W
4 v7 A. l( E. j" Z
示例如下:
  u0 S- ^6 S; [7 X) b3 u+ [
: R% y7 F/ s( z. q% d4 m复制代码8 H8 W  s9 |& U/ A& x
using System;
' _5 `. F/ i7 x$ Gusing System.Management.Automation;
# N* t+ _. f' |: X. D* c5 A. P& |( musing System.ComponentModel;
7 z: W# k  Y# _, @9 l& G4 k3 m
! g1 c' r) s4 y. tnamespace PSSnapInDemo16 k& i0 x8 e' g/ l8 i) q
{8 l- T( i: L- h- u4 y1 _
    [RunInstaller(true)]/ o" g# h/ R' R2 l- z$ [$ t' y
    public class PSSnapInInstaller : PSSnapIn. \7 Z* R+ H3 S5 ?; ?
    {
- O7 E& p; j% U        public override string Description
# Z8 K) D9 i7 A/ T% [% s/ w        {4 a: Z, d# |% S8 O2 S
            get { return "This is Luke's first Snap In demo"; }
, C3 z( A2 @& D# x) N        }6 {' @: k3 t4 X  w3 W  S! V
5 G7 r+ Z. i9 v$ C- F
        public override string Name& G, W8 r% ?- \) i: ~
        {
0 o! y3 `5 o# U" c: T- ]# b            get { return "PSSnapInDemo1"; }
# n# u( a. Q& n. K4 ~8 {        }
, f6 U/ d3 {) ]1 \/ l7 R' P/ ]' G
5 L6 x& e& X2 ^- Q1 D7 R        public override string Vendor
% Q# H- X9 y* l' u% J% |- p        {
* ]3 p1 G. Q2 o, L" c: Q! i            get { return "CaiJu"; }
+ C) z2 E/ y3 U& w; ]& y+ {        }* b  p3 E% ^6 d9 {
    }! k+ g' c8 I" W. O: k# v0 D
}3 o( K, w0 d" _2 X8 l- Z% p: ~( D9 u
复制代码* j0 N  l. c3 A* V. |
编译通过以后,PSSnapIn安装类也完成了,这样我们编写代码的工作就全部完成了。编译整个解决方案,生成类库文件。
4 y( q! F7 \, w' a3 v' i* i. D: Y3 Q& R
使用管理单元
& ~. I- x* p: P  编写好的管理单元,在使用之前需要先注册。注册流程如下:
" \% ]0 c6 @# o5 r; l3 `  G
5 C5 Y7 V- J0 \& b  1、打开Visual Studio自带的命名行,并且导航到PSSnapInDemo1.dll的目录中;( @( S" q" B2 B3 g( S- q, P
- V4 `$ o- b1 F. ^
  2、执行“installUtil /i PSSnapInDemo1.dll”命令;
  z6 d5 v. ~8 P8 [2 \& h2 M/ U
7 m- T  W5 M. s5 I$ k- L如上命令如果成功执行,注册过程就完成了;如果不成功,请仔细检查安装过程的log文件。
% W8 O) h6 B0 i! v, O7 d: v
- {/ h! w6 L2 Z2 ?- b: C  PowerShell管理单元注册成功后,就可以将其添加到当前会话中使用了。查找已经注册的PowerShell管理单元,可用以下命令:4 }( S* y* ^' O8 v0 K
' P" G9 W. c' r5 @6 V
复制代码
* m2 A- _% J+ t' K" zPS C:\Users\luke> Get-PSSnapin -Registered | ft
& G3 @. y+ o7 {* ~8 {7 l8 @# A
& M- I0 l6 M$ D& r$ Q, N9 s* `Name                           PSVersion            Description" C! P' h3 g& L, _
----                           ---------            -----------$ _5 W' I7 I8 q8 [
PSSnapInDemo1                  2.0                  This is Luke's first Snap I...4 L4 m8 V; n' M7 S
SqlServerCmdletSnapin100       2.0                  This is a PowerShell snap-i...3 F/ d( |; c$ n1 l- E
SqlServerProviderSnapin100     2.0                  SQL Server Provider
; c' @8 M2 P: A" @- ^/ i; j/ w) n复制代码
+ U$ o' y5 V% S: R- o4 U$ A4 e( x# c4 ]% L
以上命令的输出结果已经显示出了我们刚刚注册的PowerShell管理单元,添加管理单元使用如下命令:
; ~1 m7 d/ M" h  B
$ u. o  I( ?' a: L: GPS C:\Users\luke> Add-PSSnapin -Name PSSnapInDemo1
+ D% ^( a% s1 x3 B6 ?/ V/ r8 x, |4 d4 [1 b5 m
PowerShell管理单元添加成功后,就可以使用其中的命令了,使用方法与使用系统自带的cmdlet命令相同。
: V* v/ J) J, y2 d/ z5 J1 c
$ u. z, m* v  J5 N/ a! I编写二进制模块! _7 o$ H( x0 @, c7 c: \. ~
  编写二进制模块的编写与编写管理单元的方法基本相同,都需要实现cmdlet类,但它不需要实现安装类。具体方法参见上述编写cmdlet类的步骤。需要说明的是,同时实现了PSSnapIn类的类库,仍然可以当作二进制模块来使用。也就是说,PowerShell管理单元的程序集文件,可以不加修改的当成二进制模块的程序集来使用。3 e+ k3 f. F9 u

% B4 k7 w; ?' w0 D使用二进制模块( h# b6 t) c- L+ [" I" I
  二进制模块的使用与PowerShell入门(十一):编写脚本模块中脚本模块的使用方法相同,即在搜索目录下创建同名文件夹,并将程序集拷贝进去,可选创建描述文件等;然后查找和导入模块。之后,二进制模块中的命令就可以使用了。
6 p& }4 D3 x' v0 F. P/ [
0 Z" c$ z! q7 ^( i; y结语. ]- `+ f0 A1 |
  除了自定义cmdlet外,PowerShell管理单元还可以编写自定义提供程序。提供程序是一个更高级别的概念,系统预定义的有文件系统、注册表和证书等。不过,PowerShell管理单元中不能定义别名和变量,如果你需要这些功能,可以选择使用脚本模块。7 x* A0 h) O; @

8 @8 s3 E3 U* h% G2 ]% E9 i; }1 Y! L7 Z% u) c
上一篇
下一篇
soarcloud殷勤地给楼主揉揉肩捶捶背,楼主奖励2 个 金币.


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

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

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

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

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

本版积分规则

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

GMT+8, 2021-7-30 17:40 , Processed in 0.035013 second(s), 21 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表