人的记忆本来就是暧昧的,不值得信任。 收藏本站
登陆 / 注册 搜索

阅读: 6.6K   回复: 3

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

[复制链接]
soarcloud 「龙战于野」 2016-8-5 17:49 |显示全部楼层

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

  现在通过编写模块就可以在PowerShell命令行或者脚本中管理大型、分布式软件系统,就像Exchange Server和SharePoint Server正在做的那样。你有这样的需求吗?6 ^2 q% N% E3 R  z9 {1 u

: Z5 S3 z9 e. p1 Q0 [* U$ ^, f  O5 f1 h# [% g. b8 Z" q3 U5 W3 f
模块、脚本模块2 ]% Z& g* C5 J) U
  模块是PowerShell V2中引入的概念,用以改进之前提出的“管理单元”。将管理单元也作为模块(二进制模块)处理之后,PowerShell中就包括两种模块——脚本模块和二进制模块。那么什么是模块呢?模块就是包含一些PowerShell命令、项的程序包,它以一个整体被分发共享和加载使用。# U2 c- K" P* ^4 @
  脚本模块是在PowerShell V2中与模块一起提出的概念,它完全由PowerShell语法和环境编写,不需要切换到其他编译语言或者开发环境。脚本模块是现在编写PowerShell模块时推荐的方法,要好好学哦。
7 q9 D/ z  m. f
. O) i' u, E. b3 @% Y编写脚本模块
- N+ q/ K* W* X1 y  编写脚本模块包括确定模块路径、创建模块文件夹、编写模块文件和编写Manifest文件等几个方面,都非常容易操作,具体内容如下:
& Y5 _  C/ {- i. c% B# y模块安装路径3 j; ?1 J7 n4 L" x9 w* K
  理论上,模块可以放在本机的任何位置,但是如果放在Env:\PSModulePath搜索范围内,将会更加便于管理和使用。Env:\PSModulePath是与系统变量%Path%具有相同建模方式的变量,其变量值是由逗号分隔的路径组成的字符串。虽然env:PSModulePath变量中有系统预定义的两个目录,但他们可能并未创建,需要在使用的时候创建。
% \- u; Z6 _# G; ~# G* n  可以用以下命令获得两个路径:* I* h$ S# r% X
PS C:\Users\luke> $paths = (dir Env:\PSModulePath).Value.Split(";")" a. q: F# F# H9 a9 ]
PS C:\Users\luke> $paths
% |# D* N* P9 w# gC:\Users\luke\Documents\WindowsPowerShell\Modules
6 Z7 B- {/ N3 o& ?C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
7 e: b$ D6 O0 {$ r2 _2 w+ J4 O5 Y
检查路径是否已经创建可以用如下命令:7 M, z1 F+ g2 S
0 o- j! n- m" R
PS C:\Users\luke> Test-Path -Path $paths[0]/ f' p( d- d+ z  C% f# J) s; ~
False7 Y4 D- K  j1 q" k- l1 d
以上返回False,则表示路径未创建。创建路径可使用文件浏览器、Cmd命令或者PowerShell命令。这里使用PowerShell命令如下:
  E7 a1 X. A7 e5 p2 y* K
6 C/ J5 u+ l/ ~" _4 yNew-Item -Path $paths[0] -ItemType directory  -Force
* c; W* E" j4 Y3 j( k4 r这样放置模块所需要的路径就创建好了,可以进行下一步了。
' P8 T/ F& B3 p6 H, d5 m
- `* t2 n0 r: ]8 n+ {) a4 s模块文件夹1 x* B! A! X1 E) V9 F/ o
  模块文件夹是模块的一个组成部分,要与模块具有相同的名字。模块所包含的模块文件、描述文件以及其他可能用到的脚本文件都要放在这个文件夹中。例如本文需要创建模块ModuleDemo1,可以使用上述的new-item命令或者切换到脚本路径之后使用md命令,即md ModuleDemo1。! {# O& a. t) R' N
+ a, d0 w3 w4 Y5 W$ G$ k
脚本模块文件1 h1 m# O5 |/ m7 d
  脚本模块文件与一般的脚本文件内容相似,只是后缀是.psm1而非.ps1,其文件名就是模块的名字。不过,一般来说模块中应该只包含函数、别名、变量等的定义,不应进行很多操作或者输出。ModuleDemo1.psm1的简单示例如下:
& p! f4 ?) n* T, H9 u8 W. P9 {8 |0 C
, [( ?& P" S( V% N# Tfunction Greet([String] name)
6 g3 n- B, |& z) O2 L$ v. L  Q$ c{
. \8 l% s& }% f3 E0 R3 F, ?5 g    "Hello $name"1 V4 Y& x7 y& q1 U8 `5 V% _
}
; v+ J- s: r9 L4 M( ^模块描述文件7 y& b0 I4 w+ x' [) e
  描述文件也称为Manifest文件,扩展名是.psd1,它的文件名也要与模块相同。它的内容实际上是一个Hashtable;不同的是,这个Hashtable中键的名字是系统预先定义的。脚本模块文件的作用主要是限制运行环境、设置依赖项和对脚本进行一些描述。" T& [; Y% h0 A5 ~8 c% \  j$ \
  创建和编辑模块描述文件可以使用任何文本编辑器,但首次使用推荐使用命令进行。创建模块描述文件的命令如下:
- i5 z. x8 f' ]9 D3 r5 p复制代码/ K  M8 i9 o* g
PS C:\Users\luke\Documents\WindowsPowerShell\Modules\ModuleDemo1> New-ModuleManifest -Path .\ModuleDemo1.psd1
+ g9 I4 _" R/ ?7 Z6 X5 t5 m+ Ccmdlet New-ModuleManifest at command pipeline position 1% H* U4 Y5 _( D. T- h6 Z
Supply values for the following parameters:& V# T$ h! C5 K8 |+ q
NestedModules[0]:
: F+ g8 U& B2 i5 U& f$ W; A7 TAuthor: Luke Zhang" |5 t( W) q) }0 u6 X% {
CompanyName: CaiJu
" k$ d  j% _( `Copyright:0 E) Q& V; L0 D& S
ModuleToProcess: ModuleDemo1  a, }( e! d# I& a/ J
Description: Demo1
: z1 v3 {" M% [) B$ f, U8 XTypesToProcess[0]:
, v6 v7 o1 a1 g- P+ V; y4 OFormatsToProcess[0]:
: T" w+ f( S; ?0 N1 {RequiredAssemblies[0]:( t# v7 w( a! p, G6 |2 ]' L  j# ]5 @
FileList[0]:6 m5 A$ F7 z' g* `) d0 Q
复制代码9 b/ @  ?+ W* |7 m+ ~- b3 L; u
这样模块描述文件就创建好了,详细信息可以打开文件编辑。
" G3 T$ T! _" c: \: I6 Z% x3 ?2 w# n& [- D* L
使用脚本模块' C, X$ p, J2 I
  脚本模块编写好以后就可以使用了,加载使用脚本模块文件主要利用Get-Module命令和Import-Module命令。执行如下命令就能显示出我们刚刚编写的模块:7 \0 H6 W+ R# ?. D; P* `% M

+ U4 ?/ Z( F* X' o* K9 u$ k复制代码4 A! r7 Z5 u6 e7 f! V
PS D:\> Get-Module -ListAvailable7 [2 a+ Y& }! n; K; o& K
ModuleType Name                      ExportedCommands
( S. Y- f8 {- Q8 w' V% ?1 w) y---------- ----                      ----------------! t6 A  I0 Z" h; n+ ?6 }/ m
Manifest   ModuleDemo1               {}
6 \4 [+ s/ t7 q$ Y6 G# lManifest   ADRMS                     {}( c5 u4 \) `; [3 ^1 [
Manifest   AppLocker                 {}
% S! @: ^7 d# \1 ^- w" _Manifest   BestPractices             {}
# i/ j2 O3 X9 h  U. N$ FManifest   BitsTransfer              {}4 O6 S+ a7 d& u9 _9 Q2 L
Manifest   PSDiagnostics             {}
& U( k" A; v9 ~5 V' P4 h' E6 C$ LManifest   ServerManager             {}  n8 |; [% A2 y5 L3 d
Manifest   TroubleshootingPack       {}; ^) `$ O- t: o  l  O6 r7 \6 v. w
Manifest   WebAdministration         {}
% N6 q' U+ o0 p$ d. O, ^7 b! {复制代码, W9 s4 V' c  i( }0 W' ^+ q
然后导入我们刚刚编写的模块:
6 H& }4 v% N, T" f  U8 s+ ^% R
2 C" `6 ~6 ?9 N& h* B/ o  k' XPS D:\> Import-Module -Name ModuleDemo11 x- E5 p5 e! o% Q' W, w
导入之后,模块中定义的Geet函数就可以使用了:7 S, O  _+ H* @) N) I* e

( l) d7 R1 d" i7 s& Y0 TPS D:\> Greet "Luke"
) X7 ?/ k9 Q$ U3 EHello Luke
6 D  K% Z$ ]% M% x3 N如果模块中还定义了其他别名、变量等,也都可以使用。
  g6 i4 W. p  `2 E0 C7 R+ `7 ^
8 E$ |# w7 L- T' N- ~7 {, }" g结语" r# Y5 s9 }, c/ T" @. w6 `
  模块不但是大型软件脚本化管理的高效解决方案,也是共享PowerShell命令的好办法。它是PowerShell程序员为数不多的展示工作成果的方式之一,而且是其中最专业化的方式。所以,玩儿转模块,秀给所有人看。
9 ]& ^. W& y$ U" @6 x. s  {
7 O( _( b. s1 ~7 p1 [  y- b5 k$ z7 j% M* ?# h: ?, j+ u+ A
上一篇
下一篇
帖子热度 6587 ℃

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

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

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

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

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

本版积分规则

快速回复 返回列表