微风摇曳着窗帘,夕阳斜射入教室,在那里鼓起勇气告白的少年。即使现在也能清晰地回想起她的声音「当朋友,不行吗?」 收藏本站
登陆 / 注册 搜索

阅读: 5.6K   回复: 3

[# 系统基础] PowerShell入门(十一):编写脚本模块(转)

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

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

  现在通过编写模块就可以在PowerShell命令行或者脚本中管理大型、分布式软件系统,就像Exchange Server和SharePoint Server正在做的那样。你有这样的需求吗?" v3 F. p; X3 l" K4 R5 m. S: h. f, a$ q

' A6 i4 x9 G7 a' Q$ v; u) }! E+ _7 ]8 }% g& J7 O
模块、脚本模块3 K7 j/ B: W, u$ V3 W
  模块是PowerShell V2中引入的概念,用以改进之前提出的“管理单元”。将管理单元也作为模块(二进制模块)处理之后,PowerShell中就包括两种模块——脚本模块和二进制模块。那么什么是模块呢?模块就是包含一些PowerShell命令、项的程序包,它以一个整体被分发共享和加载使用。; ?( N0 ^) [% z/ B2 @4 z5 u
  脚本模块是在PowerShell V2中与模块一起提出的概念,它完全由PowerShell语法和环境编写,不需要切换到其他编译语言或者开发环境。脚本模块是现在编写PowerShell模块时推荐的方法,要好好学哦。- ^& A* m: E, `" i1 c  E9 R5 i

3 G, }; ^, I5 {3 ~0 T6 a编写脚本模块; l6 S6 v) ~1 E: ]) Z
  编写脚本模块包括确定模块路径、创建模块文件夹、编写模块文件和编写Manifest文件等几个方面,都非常容易操作,具体内容如下:$ p3 n# j. a, H3 b: y  M
模块安装路径
) |$ {7 {; a! W+ J- |9 p$ C1 I" j# U  理论上,模块可以放在本机的任何位置,但是如果放在Env:\PSModulePath搜索范围内,将会更加便于管理和使用。Env:\PSModulePath是与系统变量%Path%具有相同建模方式的变量,其变量值是由逗号分隔的路径组成的字符串。虽然env:PSModulePath变量中有系统预定义的两个目录,但他们可能并未创建,需要在使用的时候创建。
: K" ^; `# N: {, b  可以用以下命令获得两个路径:
' o2 \: J) ~3 OPS C:\Users\luke> $paths = (dir Env:\PSModulePath).Value.Split(";")' L, B% [9 K( P; l/ q7 H; F9 I
PS C:\Users\luke> $paths
6 o# P# j: ^+ t# o6 J1 ~& [8 i* @C:\Users\luke\Documents\WindowsPowerShell\Modules" P& g4 Z/ G  n+ J  R* f  I
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
3 q$ Z- c) Z, t; R
$ T! [4 d6 S% B检查路径是否已经创建可以用如下命令:
  r) F; `0 T! |- r& y& C  Q: o+ O
! S7 `) s& ^" lPS C:\Users\luke> Test-Path -Path $paths[0]
# \2 ~& k2 i' T& z6 H" k6 XFalse
1 }" E4 M" W) Z) ^! n/ P以上返回False,则表示路径未创建。创建路径可使用文件浏览器、Cmd命令或者PowerShell命令。这里使用PowerShell命令如下:
" _" \0 ^# N/ U* x& ~2 o) j: `/ V3 v
: I( t) T& o  I5 @. l( [1 rNew-Item -Path $paths[0] -ItemType directory  -Force
! U5 O$ ]& Q  {2 ^9 G这样放置模块所需要的路径就创建好了,可以进行下一步了。7 T3 N! C! }* l& a" D4 d
$ Z% ~5 R7 A% m" r7 R
模块文件夹
0 k- `7 c' D1 [* N  模块文件夹是模块的一个组成部分,要与模块具有相同的名字。模块所包含的模块文件、描述文件以及其他可能用到的脚本文件都要放在这个文件夹中。例如本文需要创建模块ModuleDemo1,可以使用上述的new-item命令或者切换到脚本路径之后使用md命令,即md ModuleDemo1。4 L) L- z: W! b# ]) j: I
+ J, _; u1 e! p" a, P, L
脚本模块文件, ?4 @" l. ^; t% H6 j* I% [# i
  脚本模块文件与一般的脚本文件内容相似,只是后缀是.psm1而非.ps1,其文件名就是模块的名字。不过,一般来说模块中应该只包含函数、别名、变量等的定义,不应进行很多操作或者输出。ModuleDemo1.psm1的简单示例如下:. r: b1 i" e4 a+ j6 y* E6 G

6 F. {$ B( t6 f6 R6 Bfunction Greet([String] name), V; ]% z5 U; u0 r+ p
{
8 v* d2 B  R! F  ]0 i    "Hello $name". M# u; f& {5 [9 w9 Y2 _
}
5 v8 G2 \# S2 d* F4 c$ E模块描述文件5 b7 b: |8 f. y
  描述文件也称为Manifest文件,扩展名是.psd1,它的文件名也要与模块相同。它的内容实际上是一个Hashtable;不同的是,这个Hashtable中键的名字是系统预先定义的。脚本模块文件的作用主要是限制运行环境、设置依赖项和对脚本进行一些描述。
% U8 ^3 k' p9 Z- n; a  创建和编辑模块描述文件可以使用任何文本编辑器,但首次使用推荐使用命令进行。创建模块描述文件的命令如下:
+ @; d6 {9 T5 k5 Z复制代码0 b9 q- w1 Q7 i
PS C:\Users\luke\Documents\WindowsPowerShell\Modules\ModuleDemo1> New-ModuleManifest -Path .\ModuleDemo1.psd12 d6 S: `0 N, Y
cmdlet New-ModuleManifest at command pipeline position 1
1 R6 b; o1 @+ {0 [" WSupply values for the following parameters:
2 t& a+ J, E0 m( V% [( g& dNestedModules[0]:
- G- M% u9 M  fAuthor: Luke Zhang6 W7 ~* f4 r# P8 m: y" K
CompanyName: CaiJu
5 v* }- D4 h7 W  ~# P) w0 NCopyright:7 x* d* X1 d1 H7 r; u
ModuleToProcess: ModuleDemo1
6 c" W% F6 ]7 N. J# nDescription: Demo1
: E+ M9 f/ x$ r" iTypesToProcess[0]:
* X4 f2 d7 a" [3 W( y  \  `3 HFormatsToProcess[0]:. y6 R6 L# `" y0 Q  l
RequiredAssemblies[0]:/ E. I" n. B1 W" f/ [
FileList[0]:
4 C: k! O. _5 q: n% @! D) a复制代码
5 S/ a0 Q" y8 z0 j" @6 v这样模块描述文件就创建好了,详细信息可以打开文件编辑。- s  A6 R: f( V& z) S

+ H! ~4 H" k0 Y. }% @' }7 q0 u使用脚本模块+ T5 M; x3 v" P
  脚本模块编写好以后就可以使用了,加载使用脚本模块文件主要利用Get-Module命令和Import-Module命令。执行如下命令就能显示出我们刚刚编写的模块:
' z3 g' W# F+ {, h* E. j0 \! S- F( X1 @( }5 e
复制代码9 ?- P4 W) ?+ s6 d- z
PS D:\> Get-Module -ListAvailable
# r- E) B# [5 l+ f4 wModuleType Name                      ExportedCommands1 A+ J/ G: Q& \' S
---------- ----                      ----------------
& ?, v3 m5 m7 f) pManifest   ModuleDemo1               {}
0 Y) q, \! l) u* A1 RManifest   ADRMS                     {}
9 Y% }; j7 r  w& m+ S% K$ g6 AManifest   AppLocker                 {}/ o* Q. f# s  ]/ t
Manifest   BestPractices             {}2 e8 h; f$ V$ w1 a
Manifest   BitsTransfer              {}
# |& ?/ u" K# `& t  i; GManifest   PSDiagnostics             {}
* g$ z. Q' {  z$ @% M9 f) vManifest   ServerManager             {}
0 I' v# V" |* @% T9 ZManifest   TroubleshootingPack       {}% d- k' w- K. h& e& T0 ~" ~3 B  D9 h
Manifest   WebAdministration         {}7 e- \! s+ c( |1 H- ?' ]( x
复制代码+ s1 c% u& f6 n' s
然后导入我们刚刚编写的模块:; q! N" E0 W% K1 O
0 w! R- Q: C0 Z  }; g7 j) {( }
PS D:\> Import-Module -Name ModuleDemo1' r) ?  C: W0 \7 b
导入之后,模块中定义的Geet函数就可以使用了:; o7 j, E6 q( {: J  f2 \; q

2 U3 y7 l. p2 L) MPS D:\> Greet "Luke"' E' ?/ [# U0 {& V/ E
Hello Luke
4 J4 c+ B& I% s) z' j7 `9 A( t如果模块中还定义了其他别名、变量等,也都可以使用。% g. v0 @# V& N# }$ i4 v( x

0 a4 [, M3 P4 Q6 C6 l结语
) R; Z! L6 P# ~0 c3 D" H2 i* o  模块不但是大型软件脚本化管理的高效解决方案,也是共享PowerShell命令的好办法。它是PowerShell程序员为数不多的展示工作成果的方式之一,而且是其中最专业化的方式。所以,玩儿转模块,秀给所有人看。5 v* n' a3 I7 O6 b' |5 E
( n, D/ u' N3 v+ j1 D/ s
$ R* s6 H- q- }, w
上一篇
下一篇


流星☆坠落 「出类拔萃」 2018-5-3 06:56 来自手机 |显示全部楼层

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

占位编辑
一起一伏 「龙战于野」 2018-5-7 12:53 |显示全部楼层

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

君甚吊,家翁可知?#y445:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

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

GMT+8, 2021-9-18 21:51 , Processed in 0.026664 second(s), 22 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表