Yesterday is a history, tomorrow is a mystery, but today is a gift. 收藏本站
登陆 / 注册 搜索

阅读: 8.4K   回复: 3

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

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

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

  PowerShell一开始就提出利用管理单元来实现自定义cmdlet,为大型软件系统提供有别于UI界面的脚本化管理方案。在PowerShell V2中,PowerShell管理单元还能以二进制模块的方式处理。& N0 g: B7 X1 }+ A
$ l1 s; |6 Z  o3 x! s# s
编写管理单元
2 U. K5 K/ i$ r' J! q0 ?  编写PowerShell管理单元需要依赖System.Management.Automation程序集;而System.Management.Automation程序集是Windows SDK的一部分,所以安装Windows SDK是编写PowerShell管理单元的先决条件。可以从这里下载Windows SDK。
0 K4 O3 \5 _( G1 f+ g, Z  作为编写PowerShell管理单元的准备,我们先打开VS2008或者VS2010,创建一个类库项目,目标.Net Framework版本选择3.5。简单编译通过之后,就可以编写cmdlet命令类和SnapIn安装类了。
9 E. ~# o2 b  ~& {- W  v( {* m, e
编写cmdlet类  X7 j2 r2 H$ d1 j/ y
  自定义cmdlet类有以下几个步骤:3 o% N5 s8 F5 p& f2 H+ D" w
  1、在项目中添加对System.Management.Automation程序集的引用(路径是C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll);并且添加相应命令空间的引用using
3 a" |) I; N4 ]2 y6 p5 sSystem.Management.Automation;
* m# b9 Y8 W9 G8 k  2、创建名为New-Addition的类,添加对命令空间System.Management.Automation的引用;
# j& H) U; t6 c  3、让New-Addition类继承自PSCmdlet,并给New-Addition类添加Cmdlet属性标记,设置动词和名词;5 x- P+ u2 m2 t, c( `( C
  4、添加参数信息,参数一定要用Parameter属性标记;: v* Y: `, O1 E% E; V0 K% w
  5、重载ProcessRecord函数,实现自己的业务逻辑;
) e3 y; u) N" P$ g& L0 ?1 p5 \+ `
/ M( y( @$ W3 [3 M+ _编写cmdlet类的示例如下(本文示例参考了Ivor Bright's blog):9 N) J" I/ R( j
复制代码" i9 l) U  n7 T/ c( D
using System;' @& {, f" O( X/ h& t
using System.Management.Automation;- q+ e% `2 b/ u5 l
: K) i' D& e7 W$ b9 R- D# `, W1 b# Y
namespace PSSnapInDemo1: I* q  [  j' H
{
9 ]3 A+ n# H0 V: y' W    [Cmdlet(VerbsCommon.New, "Addition")]. [* a: \3 ^& a2 d( P
    public class New_Addition: PSCmdlet
) s) Y; O1 ?( A1 H+ f    {
" C, y% P# I- b0 L        [Alias("X")]
1 r* K4 V: Y3 F. z        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]* A( V" R! @  u. K5 q, Y5 x
        public int FirstParameter { get; set; }
5 l- R* z, l0 l: x2 a, G( C! y& X
: R  y" K- z0 Q8 d        [Alias("Y")]
: W- q, z2 J0 @# p: ~2 \        [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true)]
' a; T% X; N/ P) a        public int SecondParameter { get; set; }
  t' k  O* m) `8 J0 }+ t. L+ e# {" [
        protected override void ProcessRecord()
1 x5 `% D4 n4 }3 r% f; O. w& p2 x        {
9 E  U* x4 u% Z, e" u0 o            WriteObject(string.Format("{0} + {1} = {2}", this.FirstParameter, this.SecondParameter, ! z: F- @' |- h& z0 `" Y, T) r# b# H
                this.FirstParameter + this.SecondParameter));
6 P, C7 x% N5 P        }
1 H  l4 W4 y) P& n( {+ V8 m    }" G8 X  f" v6 `$ C7 y" K! i* C/ T$ x3 N
}
! N4 f6 l& j3 S3 z# m0 b复制代码  a: B" X3 j# x# n! U
编译通过后,自定义的cmdlet类就完成了,接下来就可以编写PSSnapIn安装类了。
. p8 a3 u9 D8 E  G, O( K
, Y1 P  p& Y" ]编写PSSnapIn安装类
) m( D* I, G! w9 j: ]# E% \  编写PSSnapIn安装类的目的是使该类库能够被安装,并且被系统识别为PowerShell管理单元。步骤如下:- X) V8 M* h3 r6 P4 T1 e; A' W

% E  V  p0 e" `7 D4 ]  1、添加对System.Configuration.Install程序集的引用;& ~, r2 V, ]3 W& M  z

2 f/ }4 [8 |' ^8 l  2、创建名为PSSnapInInstaller的类,添加对命名空间System.ComponentModel和System.Management.Automation的引用;- V6 G+ d1 B8 l3 R# e$ a
  g1 S* ?0 h0 Y9 W
  3、让PSSnapInInstaller类继承自PSSnapIn,并且以RunInstaller(true)属性标识它。# a1 H& ]8 n- I% d+ u2 A' u6 v8 x" @
6 ]4 U! Z  J2 u8 f( F7 E
  4、重载Name、Vendor和Description三个属性;7 i( S% ~. G% A* W1 c. S
( |+ S5 Y# G5 ~! N: h1 x
示例如下:4 [5 ^0 [; m8 k, U" r6 G8 U% l
' |, v" f  @8 w5 x
复制代码- C# P" o* m( `% J  z; v; f
using System;7 ?! M3 J$ u9 h
using System.Management.Automation;
! s* N1 R6 m5 l- s  `using System.ComponentModel;
9 w- C' O8 k/ X1 [+ Z8 y+ _8 A* [0 W( x3 r) I7 c' p
namespace PSSnapInDemo1
( O9 R9 `3 ]: t% r{
# y9 j! N# L, z0 i8 ?    [RunInstaller(true)]9 f" y: h+ C0 v8 J
    public class PSSnapInInstaller : PSSnapIn
8 f6 P3 t% ~$ \5 D0 g    {$ h( A& p" O& X: R6 p& o4 L
        public override string Description
! v2 x8 T5 S: F0 r        {
/ O* M, L' b( Q# A            get { return "This is Luke's first Snap In demo"; }9 m6 p  [1 b/ a; ?+ ^' w2 e3 `
        }
8 \+ G- |8 V# X, O) Z/ T2 z6 z% n( @; u
        public override string Name
2 T! v' d9 d( J* C7 F5 ^% `; F        {
% }7 O2 S1 {9 E+ N4 j2 b            get { return "PSSnapInDemo1"; }
/ d6 S( f; f) Q" y        }4 o3 u1 B/ S% H

6 y5 Z* y; ]5 ?% r/ f8 _        public override string Vendor5 H( a" M5 G9 ]  x
        {
# x3 V) {: ]' ]1 P2 }! u            get { return "CaiJu"; }
9 b( }) R! s& J/ i% H: Q5 i        }4 {6 Z7 ?6 K& {, ?, k. p
    }5 k5 s3 w! Y) ~
}
" _+ z5 i8 h$ o" r5 s复制代码
  O1 h4 [( H, k* r2 g$ Y% w) `编译通过以后,PSSnapIn安装类也完成了,这样我们编写代码的工作就全部完成了。编译整个解决方案,生成类库文件。, J$ Q3 o/ ^' t" i0 G
6 H7 J9 n! K( |2 ]; c: R3 S, H
使用管理单元( t( ]7 g: H. K( ?
  编写好的管理单元,在使用之前需要先注册。注册流程如下:
9 v1 l; q. \  k
) g1 A1 Y7 Q0 V% K4 \' E  1、打开Visual Studio自带的命名行,并且导航到PSSnapInDemo1.dll的目录中;' V& P; d: C9 V& O" i
0 M! B+ x& {2 @
  2、执行“installUtil /i PSSnapInDemo1.dll”命令;$ O! l) e$ q6 p

9 A& w7 `1 P9 J2 H5 E: q5 y2 `# Z如上命令如果成功执行,注册过程就完成了;如果不成功,请仔细检查安装过程的log文件。+ c9 E' a. w0 l- l0 v

4 {* H% M( |2 d6 |) C( r  PowerShell管理单元注册成功后,就可以将其添加到当前会话中使用了。查找已经注册的PowerShell管理单元,可用以下命令:
) ], j- P  }. A4 _' p/ I( e7 J4 b/ w" e2 }
, ~) f) @* |# x3 O! j( z3 j复制代码
7 e/ K  ]/ ^7 G% [6 }! UPS C:\Users\luke> Get-PSSnapin -Registered | ft
" H' o" p- W3 M) B; n% D
: X2 d( F1 w1 z+ h# JName                           PSVersion            Description7 t: i9 X3 a" S5 E& y% Z4 U
----                           ---------            -----------5 t2 ?, ~8 m7 m' I- ?1 f- Y$ P! c' ~
PSSnapInDemo1                  2.0                  This is Luke's first Snap I...
( J* f5 a. e* |$ q* O$ USqlServerCmdletSnapin100       2.0                  This is a PowerShell snap-i...
$ U6 `9 {3 V: n# PSqlServerProviderSnapin100     2.0                  SQL Server Provider
) t& t# l# F4 ~6 p% ?( F' T复制代码. T, ?" r4 W  v- V! |
" x7 A) ~) s. A/ W7 b+ I& b
以上命令的输出结果已经显示出了我们刚刚注册的PowerShell管理单元,添加管理单元使用如下命令:' X! O& R; e5 o
0 v4 f5 {; U) p, B
PS C:\Users\luke> Add-PSSnapin -Name PSSnapInDemo1
; Q; z6 B, e4 o& u+ K9 N! B9 l- j* }1 X( ^1 {" o- i
PowerShell管理单元添加成功后,就可以使用其中的命令了,使用方法与使用系统自带的cmdlet命令相同。
" x' N. I& s; O7 A- ~* M5 X. C  S
; b" d9 T6 G6 q9 W! n编写二进制模块- n' E1 c1 r/ M4 G  O9 [$ U; z
  编写二进制模块的编写与编写管理单元的方法基本相同,都需要实现cmdlet类,但它不需要实现安装类。具体方法参见上述编写cmdlet类的步骤。需要说明的是,同时实现了PSSnapIn类的类库,仍然可以当作二进制模块来使用。也就是说,PowerShell管理单元的程序集文件,可以不加修改的当成二进制模块的程序集来使用。/ a- l; L/ U( r4 t

! e! C) t0 M1 G& V使用二进制模块; a" Q1 Y4 n2 a, J3 I1 c- X
  二进制模块的使用与PowerShell入门(十一):编写脚本模块中脚本模块的使用方法相同,即在搜索目录下创建同名文件夹,并将程序集拷贝进去,可选创建描述文件等;然后查找和导入模块。之后,二进制模块中的命令就可以使用了。" c$ r0 G& ^# `; D

& V; c/ N" t0 Q7 Z" w, C结语! }1 ^  B$ }7 ?+ s" T# L% r
  除了自定义cmdlet外,PowerShell管理单元还可以编写自定义提供程序。提供程序是一个更高级别的概念,系统预定义的有文件系统、注册表和证书等。不过,PowerShell管理单元中不能定义别名和变量,如果你需要这些功能,可以选择使用脚本模块。
+ N1 G1 l6 _- y; }9 x4 g3 \, b$ W' ]2 Q
; x. I* x6 r& x! O0 \, K. l6 U
9 e  {% F2 R2 F# I4 f


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

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

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

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

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

本版积分规则

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

GMT+8, 2020-11-24 13:48 , Processed in 0.037121 second(s), 21 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表