每当对这个世界感到绝望的时候,买一包泡面,然后告诉自己:我们的泡面是有酱包的。 收藏本站
登陆 / 注册 搜索

阅读: 5.1K   回复: 3

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

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

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

  现在通过编写模块就可以在PowerShell命令行或者脚本中管理大型、分布式软件系统,就像Exchange Server和SharePoint Server正在做的那样。你有这样的需求吗?' P3 w* r6 l( j$ s4 k5 ?

3 C; W" C+ r" u- \% k" ~, o+ |; z4 L! x( t) Q! z( d2 S. t: L4 e+ t3 i2 ?
模块、脚本模块3 ~% Z& |7 b( R4 T* T+ j
  模块是PowerShell V2中引入的概念,用以改进之前提出的“管理单元”。将管理单元也作为模块(二进制模块)处理之后,PowerShell中就包括两种模块——脚本模块和二进制模块。那么什么是模块呢?模块就是包含一些PowerShell命令、项的程序包,它以一个整体被分发共享和加载使用。
+ g2 t, J$ L: j, `% h7 h  脚本模块是在PowerShell V2中与模块一起提出的概念,它完全由PowerShell语法和环境编写,不需要切换到其他编译语言或者开发环境。脚本模块是现在编写PowerShell模块时推荐的方法,要好好学哦。
9 X0 n3 S1 ]- I4 }: \( ~" @' U" Q6 v
编写脚本模块
" Y" k, \# s$ r  编写脚本模块包括确定模块路径、创建模块文件夹、编写模块文件和编写Manifest文件等几个方面,都非常容易操作,具体内容如下:
) ?7 c( b/ R7 S* r6 t模块安装路径
/ }4 l0 W$ R" K  理论上,模块可以放在本机的任何位置,但是如果放在Env:\PSModulePath搜索范围内,将会更加便于管理和使用。Env:\PSModulePath是与系统变量%Path%具有相同建模方式的变量,其变量值是由逗号分隔的路径组成的字符串。虽然env:PSModulePath变量中有系统预定义的两个目录,但他们可能并未创建,需要在使用的时候创建。6 C# \/ I+ f: I( z. @
  可以用以下命令获得两个路径:
/ J+ ^# Y+ i$ {PS C:\Users\luke> $paths = (dir Env:\PSModulePath).Value.Split(";")4 i1 M4 g. l1 K( i; B# _3 ?
PS C:\Users\luke> $paths8 [( G; B# C% m* B! Z& k
C:\Users\luke\Documents\WindowsPowerShell\Modules9 b+ ?2 m$ S, N- }" i
C:\Windows\system32\WindowsPowerShell\v1.0\Modules\6 T! v  z# L. m1 O  a. F- B
' E; B4 C1 k/ q0 [# {! D, Z
检查路径是否已经创建可以用如下命令:
, ?  p8 z' e6 {& `3 N& j# f
! K5 N+ f; P0 O6 ]" d, ^6 C, tPS C:\Users\luke> Test-Path -Path $paths[0], v3 e4 D  ^) l
False
- L! W+ L( w. W. k, v以上返回False,则表示路径未创建。创建路径可使用文件浏览器、Cmd命令或者PowerShell命令。这里使用PowerShell命令如下:
, f+ l* U  w- i- \0 c- A0 V/ k' {$ {
/ e; ~- v9 R+ sNew-Item -Path $paths[0] -ItemType directory  -Force
! `" L3 G, f. A3 [9 [, R' n这样放置模块所需要的路径就创建好了,可以进行下一步了。
; o' j# i* S: l6 W1 _. ~' k. g5 Z! t. p4 v! v- x' E! Q
模块文件夹
/ U* }' J* q% O0 c( R  模块文件夹是模块的一个组成部分,要与模块具有相同的名字。模块所包含的模块文件、描述文件以及其他可能用到的脚本文件都要放在这个文件夹中。例如本文需要创建模块ModuleDemo1,可以使用上述的new-item命令或者切换到脚本路径之后使用md命令,即md ModuleDemo1。3 D/ n/ J' M/ |! F$ s$ `5 _
# O' s! u8 h! T' U/ Q$ g
脚本模块文件
6 y" m6 `* A1 u. B8 r7 v! M; A. ~  脚本模块文件与一般的脚本文件内容相似,只是后缀是.psm1而非.ps1,其文件名就是模块的名字。不过,一般来说模块中应该只包含函数、别名、变量等的定义,不应进行很多操作或者输出。ModuleDemo1.psm1的简单示例如下:3 g+ T/ }# w3 P2 x& [/ j

1 K( o5 l  R( T" c7 nfunction Greet([String] name)! m5 x) s- V6 @7 ?1 Z
{
. c1 M' u( t2 |) U; R1 Q4 ~. @+ K    "Hello $name"
# b7 Y1 D5 M+ G1 c% z- `}( H5 ~2 j' {" ]; S; Y3 M
模块描述文件% E% B4 H0 q# c: D. p
  描述文件也称为Manifest文件,扩展名是.psd1,它的文件名也要与模块相同。它的内容实际上是一个Hashtable;不同的是,这个Hashtable中键的名字是系统预先定义的。脚本模块文件的作用主要是限制运行环境、设置依赖项和对脚本进行一些描述。
, B7 A0 S# h# R2 j+ v  创建和编辑模块描述文件可以使用任何文本编辑器,但首次使用推荐使用命令进行。创建模块描述文件的命令如下:% z$ O0 L$ L+ L" w
复制代码
! r/ g9 ^8 y$ j& g; ~+ TPS C:\Users\luke\Documents\WindowsPowerShell\Modules\ModuleDemo1> New-ModuleManifest -Path .\ModuleDemo1.psd14 F: E9 X' o! X. i
cmdlet New-ModuleManifest at command pipeline position 19 i# j$ l  G) P+ D
Supply values for the following parameters:
0 ?& Z+ N  ?* D2 ]1 bNestedModules[0]:* y' N3 z  L- J, M
Author: Luke Zhang- s/ W( `( A7 K: y- F6 U# ?* L* f
CompanyName: CaiJu
. z( O$ i2 E/ ~! ]: ^Copyright:
+ _- |  k& [! i4 r7 c0 Z/ m+ iModuleToProcess: ModuleDemo1' [' `% y! i- D
Description: Demo1
8 i4 U4 c2 {, C2 \, ]TypesToProcess[0]:
. p- Z4 ?8 r# p$ \+ {( s/ [FormatsToProcess[0]:+ C! ?) @5 i* S; a
RequiredAssemblies[0]:
' L6 r; W. u. d( KFileList[0]:
5 F' U& ^% c% o, {, ?复制代码
2 w7 c0 }  W0 S5 t! ?这样模块描述文件就创建好了,详细信息可以打开文件编辑。( C5 l3 R/ ^4 H$ q! ~
4 P2 S" P8 d- n
使用脚本模块: o1 S- p8 G  j$ r* p
  脚本模块编写好以后就可以使用了,加载使用脚本模块文件主要利用Get-Module命令和Import-Module命令。执行如下命令就能显示出我们刚刚编写的模块:; p3 E6 [) L$ {: z( u
3 P' O( [+ ]' F) q+ I  A5 [
复制代码: m0 W/ X% i3 I2 C
PS D:\> Get-Module -ListAvailable
( V0 }5 K0 P" x9 t2 U  S4 `7 B' d5 XModuleType Name                      ExportedCommands
% K: t; t) Y/ l. O6 B2 r& {" e---------- ----                      ----------------* @: z. k. P, O6 B* }" b/ H
Manifest   ModuleDemo1               {}
4 B7 t/ L* K: C# K, F1 LManifest   ADRMS                     {}# u* Q, F4 G1 p( Z* |7 w* ~
Manifest   AppLocker                 {}
  ]- t2 c1 c  yManifest   BestPractices             {}
) j# j/ G) l' R0 G; jManifest   BitsTransfer              {}. ~% G4 F. C! C. Y2 P6 G
Manifest   PSDiagnostics             {}
  ~/ y4 `5 i# V$ g+ `Manifest   ServerManager             {}
/ z4 F1 J2 Y0 A! IManifest   TroubleshootingPack       {}
/ [' A& {0 F  N4 [8 a9 G4 UManifest   WebAdministration         {}
. G# m' A& A; E& M+ l7 M复制代码/ t9 N$ {5 B1 O. r  P1 p
然后导入我们刚刚编写的模块:" l$ A8 x$ Z) _9 ]" g
9 X) a  Z+ g5 Z  m) K0 Y
PS D:\> Import-Module -Name ModuleDemo1- \( U& w& z' L% l6 X2 w
导入之后,模块中定义的Geet函数就可以使用了:, ]. z+ P! {/ K) g2 L" N4 _. T
7 S/ ?8 F5 D4 W3 o2 r
PS D:\> Greet "Luke"
6 r: V! V$ P7 @% I* SHello Luke
, p& U: A# ]) y如果模块中还定义了其他别名、变量等,也都可以使用。" S: A3 ]* w, d6 ]' |: ^) N2 |& \
5 P! D7 \8 U' A& J5 [
结语7 o& u8 }8 S# [8 P+ ~
  模块不但是大型软件脚本化管理的高效解决方案,也是共享PowerShell命令的好办法。它是PowerShell程序员为数不多的展示工作成果的方式之一,而且是其中最专业化的方式。所以,玩儿转模块,秀给所有人看。  r9 J& h. N. G+ v# f: f9 K
2 W5 Y7 [1 e2 \$ D
1 s3 L2 Z7 z/ x& J. ]6 T+ n
上一篇
下一篇


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

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

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

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

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

本版积分规则

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

GMT+8, 2021-4-11 09:25 , Processed in 0.030590 second(s), 18 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表