虽有遗憾,并无后悔。 收藏本站
登陆 / 注册 搜索

阅读: 5.2K   回复: 3

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

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

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

  现在通过编写模块就可以在PowerShell命令行或者脚本中管理大型、分布式软件系统,就像Exchange Server和SharePoint Server正在做的那样。你有这样的需求吗?
$ l/ x+ n2 T6 i  I1 r+ W( v) c
0 O1 y  \" S8 z2 L9 D( G
/ A5 i! O5 `: h3 y8 h模块、脚本模块, i+ \+ }. {1 w3 _9 L$ |
  模块是PowerShell V2中引入的概念,用以改进之前提出的“管理单元”。将管理单元也作为模块(二进制模块)处理之后,PowerShell中就包括两种模块——脚本模块和二进制模块。那么什么是模块呢?模块就是包含一些PowerShell命令、项的程序包,它以一个整体被分发共享和加载使用。. h& J# b( G1 }& Q% d7 _: m
  脚本模块是在PowerShell V2中与模块一起提出的概念,它完全由PowerShell语法和环境编写,不需要切换到其他编译语言或者开发环境。脚本模块是现在编写PowerShell模块时推荐的方法,要好好学哦。: Z, c' g& q; x2 g# A7 b
4 z5 R, {5 G2 @0 M
编写脚本模块
6 A/ ^& R; G. ]9 W- G* m  编写脚本模块包括确定模块路径、创建模块文件夹、编写模块文件和编写Manifest文件等几个方面,都非常容易操作,具体内容如下:
, R+ s; v8 z0 Y& |+ L! {$ g模块安装路径
/ J8 G) O) n  f: x5 F% B  理论上,模块可以放在本机的任何位置,但是如果放在Env:\PSModulePath搜索范围内,将会更加便于管理和使用。Env:\PSModulePath是与系统变量%Path%具有相同建模方式的变量,其变量值是由逗号分隔的路径组成的字符串。虽然env:PSModulePath变量中有系统预定义的两个目录,但他们可能并未创建,需要在使用的时候创建。
3 L8 h5 m6 F: L7 _  可以用以下命令获得两个路径:
5 p" G2 u- g+ c0 QPS C:\Users\luke> $paths = (dir Env:\PSModulePath).Value.Split(";")
& C( w7 a4 y  l* ^* T+ K9 l% `% M: \, MPS C:\Users\luke> $paths
1 [" A* ]3 V" n) S8 HC:\Users\luke\Documents\WindowsPowerShell\Modules6 F6 x& e# Y1 G/ b0 b
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\, s& K& k5 x( n

5 b' E& x1 L1 Q& [$ l( [2 r检查路径是否已经创建可以用如下命令:) ]1 ^, k& O8 V; d2 B+ ?( f3 |

9 u$ z1 p! o4 DPS C:\Users\luke> Test-Path -Path $paths[0]  n9 t% x3 I6 \
False+ a: s4 G# d7 E6 x  U" E0 g
以上返回False,则表示路径未创建。创建路径可使用文件浏览器、Cmd命令或者PowerShell命令。这里使用PowerShell命令如下:8 ?+ m0 G4 _6 y! Q
0 Z9 h5 D. f( L3 V& V
New-Item -Path $paths[0] -ItemType directory  -Force4 g1 E  ^$ G. g/ y8 z
这样放置模块所需要的路径就创建好了,可以进行下一步了。
/ x4 Z( T3 F- v! N
/ q+ G$ h* X) c& A2 c模块文件夹
7 ~( r: y" ^) p  模块文件夹是模块的一个组成部分,要与模块具有相同的名字。模块所包含的模块文件、描述文件以及其他可能用到的脚本文件都要放在这个文件夹中。例如本文需要创建模块ModuleDemo1,可以使用上述的new-item命令或者切换到脚本路径之后使用md命令,即md ModuleDemo1。
: K. `: p  U# {9 B6 f, d* B$ `
; @& X( \* ~1 Y, c/ `! O' U脚本模块文件; I( f: I# ?4 _3 c$ D% ?- Q
  脚本模块文件与一般的脚本文件内容相似,只是后缀是.psm1而非.ps1,其文件名就是模块的名字。不过,一般来说模块中应该只包含函数、别名、变量等的定义,不应进行很多操作或者输出。ModuleDemo1.psm1的简单示例如下:
7 p: F  D, P, i8 h& i4 X& O" b% W- h
function Greet([String] name)* g% _9 L5 {5 A' f, {  ^) w
{
3 e+ L) J) _& A6 e, j( `# P. m    "Hello $name"
0 u: ^( X% _0 l+ [}* y, ?' J! E$ H9 S; G9 o! k
模块描述文件* ~8 i$ s+ K7 Y9 p0 q3 H
  描述文件也称为Manifest文件,扩展名是.psd1,它的文件名也要与模块相同。它的内容实际上是一个Hashtable;不同的是,这个Hashtable中键的名字是系统预先定义的。脚本模块文件的作用主要是限制运行环境、设置依赖项和对脚本进行一些描述。
9 R# o& G, o0 X5 j! s. I  创建和编辑模块描述文件可以使用任何文本编辑器,但首次使用推荐使用命令进行。创建模块描述文件的命令如下:
% q& `" [6 N8 u% C9 i复制代码
) \* O- {9 p: _8 `! OPS C:\Users\luke\Documents\WindowsPowerShell\Modules\ModuleDemo1> New-ModuleManifest -Path .\ModuleDemo1.psd1
7 y  @" A' {: o- R7 ]$ _cmdlet New-ModuleManifest at command pipeline position 1
6 D8 ?1 s% c5 g/ j  O2 x  p& ]8 wSupply values for the following parameters:  d" ?0 J3 U! {. w8 W0 o* D
NestedModules[0]:0 y  v( k( @6 Y7 w: E& L. i
Author: Luke Zhang& `  `2 |: q; s0 T  V! N1 W
CompanyName: CaiJu
9 z/ b$ }- ^/ SCopyright:
, L1 b) i4 p( h( L: tModuleToProcess: ModuleDemo1; w3 [' E9 t1 f* Q3 C5 g" }
Description: Demo1
, q9 j7 u3 g4 v6 @TypesToProcess[0]:& @* E# f7 H# H6 O& \0 H$ _9 w
FormatsToProcess[0]:& [' M5 u3 r' a3 i
RequiredAssemblies[0]:
, l- M- h+ j$ ~9 }FileList[0]:
4 l- w) D, O4 j& `5 C0 U复制代码- n3 i( F% s. {4 {! c
这样模块描述文件就创建好了,详细信息可以打开文件编辑。8 G9 b: D% h6 U& [# s" `

" S3 V3 C2 y4 E) w6 _4 d使用脚本模块: U$ D' _6 B" W4 C( ]
  脚本模块编写好以后就可以使用了,加载使用脚本模块文件主要利用Get-Module命令和Import-Module命令。执行如下命令就能显示出我们刚刚编写的模块:; H, q8 [$ F# r8 I4 A# g

/ T& X4 p6 Q7 S5 w" h" J  {复制代码2 v! \& D. {$ @6 A
PS D:\> Get-Module -ListAvailable1 v/ i& J, p3 J) I2 K+ n
ModuleType Name                      ExportedCommands
- {  _* v8 H3 \9 q  U---------- ----                      ----------------
$ a1 ?- Q0 k. D4 T+ y$ }# LManifest   ModuleDemo1               {}  i1 n- P: j2 c; _* l# J( w2 B5 |
Manifest   ADRMS                     {}( t: x0 P& R0 m$ v7 I5 o5 k' L
Manifest   AppLocker                 {}  @! Q3 }5 C# C3 b7 B
Manifest   BestPractices             {}
* l2 @/ L: Z: d2 EManifest   BitsTransfer              {}
5 [9 u+ Z* G3 v7 MManifest   PSDiagnostics             {}, y( [1 w, I2 s
Manifest   ServerManager             {}5 w! N  F% K- ^
Manifest   TroubleshootingPack       {}
$ A% ?( C5 n, n0 ~Manifest   WebAdministration         {}0 `# B4 f8 B+ v  Z: }
复制代码  {  I+ r7 F7 @( K- U+ r0 ~
然后导入我们刚刚编写的模块:
+ Q& h6 m. g' Z& e: {+ F. R, ~1 G, ^. m1 F: n" F( y  M6 \! ^
PS D:\> Import-Module -Name ModuleDemo14 Z" w( U- x* O3 M; w, \
导入之后,模块中定义的Geet函数就可以使用了:% P2 j0 p8 l' k8 E: J7 n

0 U3 z8 Y6 }  Y/ _/ ^$ N3 p6 fPS D:\> Greet "Luke"
# X6 }3 y" t0 X0 [8 E( H& N) B% hHello Luke( h5 d. {: x! {0 a5 h* }
如果模块中还定义了其他别名、变量等,也都可以使用。
$ M' P& x6 t& a4 N9 `$ g' L3 s8 b, G0 O& b8 A+ l
结语2 y& d3 i; h7 P$ Z0 o7 p
  模块不但是大型软件脚本化管理的高效解决方案,也是共享PowerShell命令的好办法。它是PowerShell程序员为数不多的展示工作成果的方式之一,而且是其中最专业化的方式。所以,玩儿转模块,秀给所有人看。8 W+ H; \; F! F! h, u7 R

* L/ o2 C+ {& X8 c9 @/ }, p- f2 j# G6 P' g
上一篇
下一篇


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

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

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

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

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

本版积分规则

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

GMT+8, 2021-6-20 02:50 , Processed in 0.028493 second(s), 19 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表