做不到的话,不过就是一死 。但是,赢了就能活下去,要是不战斗就赢不了。 收藏本站
登陆 / 注册 搜索

阅读: 4.8K   回复: 3

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

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

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

  现在通过编写模块就可以在PowerShell命令行或者脚本中管理大型、分布式软件系统,就像Exchange Server和SharePoint Server正在做的那样。你有这样的需求吗?
7 D1 @' z: r' `/ t2 L! Q# X/ z1 X
1 f% O7 K6 S" O/ m) l
模块、脚本模块4 i8 M5 h% h5 s' U8 y# o
  模块是PowerShell V2中引入的概念,用以改进之前提出的“管理单元”。将管理单元也作为模块(二进制模块)处理之后,PowerShell中就包括两种模块——脚本模块和二进制模块。那么什么是模块呢?模块就是包含一些PowerShell命令、项的程序包,它以一个整体被分发共享和加载使用。8 Y" _4 e$ |, r; H& c0 S
  脚本模块是在PowerShell V2中与模块一起提出的概念,它完全由PowerShell语法和环境编写,不需要切换到其他编译语言或者开发环境。脚本模块是现在编写PowerShell模块时推荐的方法,要好好学哦。
9 n+ s( m0 P- B. \: Z( _- E4 g+ [; @3 b5 G: Z; U" p1 t
编写脚本模块$ ?; f: G+ y* h1 m9 x4 x4 n
  编写脚本模块包括确定模块路径、创建模块文件夹、编写模块文件和编写Manifest文件等几个方面,都非常容易操作,具体内容如下:
0 B! o: C2 t7 O# l: h2 K2 k模块安装路径
1 N9 {+ l7 \0 C+ z) _( S* r* \  理论上,模块可以放在本机的任何位置,但是如果放在Env:\PSModulePath搜索范围内,将会更加便于管理和使用。Env:\PSModulePath是与系统变量%Path%具有相同建模方式的变量,其变量值是由逗号分隔的路径组成的字符串。虽然env:PSModulePath变量中有系统预定义的两个目录,但他们可能并未创建,需要在使用的时候创建。
. i7 N  o- C& o3 M2 |: o4 _  可以用以下命令获得两个路径:' u6 P) U$ g& b; D
PS C:\Users\luke> $paths = (dir Env:\PSModulePath).Value.Split(";")+ o* T/ \0 _) m( {: x
PS C:\Users\luke> $paths
) n0 v% n  F1 R2 s8 q2 Z' iC:\Users\luke\Documents\WindowsPowerShell\Modules
) I7 E6 ~9 a- Q% V4 V8 z  YC:\Windows\system32\WindowsPowerShell\v1.0\Modules\  Z/ A* V$ y0 P+ J/ V9 k
  @6 A1 e& u9 s5 H/ f
检查路径是否已经创建可以用如下命令:
+ r2 L3 d& Q) I* @: P" p: \! O/ }$ W3 }8 q) ~
PS C:\Users\luke> Test-Path -Path $paths[0]
: g+ s, U5 F# W5 v1 V% {4 k6 WFalse, d8 Q3 R, ~1 A
以上返回False,则表示路径未创建。创建路径可使用文件浏览器、Cmd命令或者PowerShell命令。这里使用PowerShell命令如下:
' E9 G  g6 B' @! L
  |* u( t0 Q& N: e2 b2 LNew-Item -Path $paths[0] -ItemType directory  -Force
3 Z& q$ G$ o" |# J3 l这样放置模块所需要的路径就创建好了,可以进行下一步了。
. k" T4 n) J. K1 P, t
' T0 K3 y3 w& O模块文件夹
) P5 s2 L+ m/ O# L2 R  模块文件夹是模块的一个组成部分,要与模块具有相同的名字。模块所包含的模块文件、描述文件以及其他可能用到的脚本文件都要放在这个文件夹中。例如本文需要创建模块ModuleDemo1,可以使用上述的new-item命令或者切换到脚本路径之后使用md命令,即md ModuleDemo1。5 @& u, d! c1 G, s* n; K) g

5 c3 e+ K) v. D8 H4 Q, Z6 Z脚本模块文件
3 Y, i/ N# z4 Q  脚本模块文件与一般的脚本文件内容相似,只是后缀是.psm1而非.ps1,其文件名就是模块的名字。不过,一般来说模块中应该只包含函数、别名、变量等的定义,不应进行很多操作或者输出。ModuleDemo1.psm1的简单示例如下:# x2 N& p: N6 I4 Z: N9 y$ G
+ t, w% b: d1 m
function Greet([String] name)3 K+ \' ]+ D0 I2 G
{. w0 n: }# l0 D1 c( e8 J4 b
    "Hello $name"( @5 i3 \' J( W$ X$ j5 j- @. I
}0 s( e! P$ y9 t+ ~. @6 t
模块描述文件
1 B( o) n- M. |% [  N  描述文件也称为Manifest文件,扩展名是.psd1,它的文件名也要与模块相同。它的内容实际上是一个Hashtable;不同的是,这个Hashtable中键的名字是系统预先定义的。脚本模块文件的作用主要是限制运行环境、设置依赖项和对脚本进行一些描述。# h4 A$ X8 k# {. p( Z) ^- A( o0 h
  创建和编辑模块描述文件可以使用任何文本编辑器,但首次使用推荐使用命令进行。创建模块描述文件的命令如下:
+ \& `6 q7 b4 ?6 W复制代码
4 l/ l' _' f: M5 EPS C:\Users\luke\Documents\WindowsPowerShell\Modules\ModuleDemo1> New-ModuleManifest -Path .\ModuleDemo1.psd1' i2 [" |6 i0 Y  k# N! x9 p
cmdlet New-ModuleManifest at command pipeline position 1
) D9 B- a7 r2 YSupply values for the following parameters:
4 \) U& d9 l& s3 FNestedModules[0]:$ D4 \9 \  s& L( u# T9 H- L$ M
Author: Luke Zhang
  I( b4 r9 x% ^3 ?8 |$ U+ L7 b/ oCompanyName: CaiJu
9 W' W$ s- D# x) P7 `Copyright:, J3 x& Z& |" v  t% u& z, l
ModuleToProcess: ModuleDemo1% ?1 G3 f5 ^( X8 @, u6 S: E
Description: Demo1
# x& R& V, b) B  d( lTypesToProcess[0]:
% r' Y* H. ~, b2 L9 J; OFormatsToProcess[0]:
3 s4 m0 }4 H3 ^, TRequiredAssemblies[0]:
( q/ B- Q7 a" [9 M$ [5 |FileList[0]:
' R' [0 ~# z+ K& v/ T* X; B复制代码
  g4 b- c, @" w& d, w& u这样模块描述文件就创建好了,详细信息可以打开文件编辑。
, w* R8 f( `+ T  K8 M0 M  b( Y& V7 r8 {
使用脚本模块' P& z$ v0 y  `0 g2 ]  }' k8 Q
  脚本模块编写好以后就可以使用了,加载使用脚本模块文件主要利用Get-Module命令和Import-Module命令。执行如下命令就能显示出我们刚刚编写的模块:$ f( n! @: }4 j* e( j* K/ T8 I. `
/ M! q3 \3 q) U# ]. c: d- `8 Q7 E
复制代码, N  f; s+ ~5 x: z! @1 m- K
PS D:\> Get-Module -ListAvailable, Z* k5 B" z$ V- c
ModuleType Name                      ExportedCommands' [5 v, o' {  e( f8 }0 v& P9 ~
---------- ----                      ----------------- |! b" U1 f9 U! T( P0 ?8 f
Manifest   ModuleDemo1               {}$ Z- o- b; G- Z. l+ G+ u6 `
Manifest   ADRMS                     {}% z% k, V; ?+ D5 K; u+ j
Manifest   AppLocker                 {}
5 r2 ~7 e; j! wManifest   BestPractices             {}' k) A: L% I7 O; x' A
Manifest   BitsTransfer              {}/ _* t0 }+ a! `4 |0 k0 F
Manifest   PSDiagnostics             {}. z' M0 i& a4 @: T& M7 R
Manifest   ServerManager             {}
' p1 N/ @8 m& d& S! nManifest   TroubleshootingPack       {}7 y/ V; F( D! G1 b6 @2 w* s/ j
Manifest   WebAdministration         {}
) g% A8 X1 h  b' x复制代码
0 J8 ?. D& Y3 J8 p% d5 j然后导入我们刚刚编写的模块:
2 {) f% z4 i7 w8 w* n- q6 Z8 Q& E, C
PS D:\> Import-Module -Name ModuleDemo1
+ E# `0 j7 Y. M6 \导入之后,模块中定义的Geet函数就可以使用了:; z  F" O( j2 z6 `% e

/ h# i, v% E4 E" lPS D:\> Greet "Luke"
: A! K' Y: u# c' Z& r; e6 cHello Luke8 D# ?: H$ t9 D! r1 F7 w/ @
如果模块中还定义了其他别名、变量等,也都可以使用。1 |5 F# V1 b- s  }. [- q& m
9 o5 E( W( s* r% }8 ^4 y4 x
结语5 A8 r8 Q0 ^, |
  模块不但是大型软件脚本化管理的高效解决方案,也是共享PowerShell命令的好办法。它是PowerShell程序员为数不多的展示工作成果的方式之一,而且是其中最专业化的方式。所以,玩儿转模块,秀给所有人看。
" q' K% M# Y: h* c3 }' b9 `5 O! h+ s
  [& e! `0 [  J4 h% I


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

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

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

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

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

本版积分规则

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

GMT+8, 2020-9-22 19:34 , Processed in 0.046781 second(s), 21 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表