我一直以为人是慢慢变老的,其实不是,人是一瞬间变老的。 收藏本站
登陆 / 注册 搜索

阅读: 6.3K   回复: 4

[# 系统基础] PowerShell入门(八):函数、脚本、作用域(转)

soarcloud 「龙战于野」 2016-8-2 15:29 |显示全部楼层

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

本帖最后由 soarcloud 于 2016-8-2 21:26 编辑 " y% q4 O6 R0 s1 I  E# j* W5 h& c
0 B" c6 w: K, G
  脚本所体现的是PowerShell的编程特性,是任务自动化的基础。函数是比脚本粒度更细的代码复用单元,可以定义在命令行中或者脚本中。作用域就是变量和函数的作用范围,是执行上下文的划分。2 \. M& X; {# Z4 z* i0 u

' o) v3 @+ d4 `函数9 j2 [; j: W2 Y: n9 t- a! U
  函数就是命名的命令列表,与一般编程语言中的函数概念具有相同的范畴。函数中不但可以有简单命令,还可以有控制流程的命令,如if、while、switch等。函数可以有匿名参数或者命名参数列表。命令参数列表可以用大括号或者Param关键字定义。匿名函数可以使用$Args变量来访问。函数也可接收来自管道的对象作为输入,管道对象可以通过$input变量类访问。
  u1 o7 [" N1 w2 i4 t  在脚本中定义的函数,可以定义在#require命令和Param关键字之后的任何位置,但要定义在调用之前。还有,自定义的函数不会自动运行,需要被明确调用。可以使用filter或者function定义函数,用filter关键字定义的函数比较简单,而使用function关键字定义的函数可以有更加复杂的功能。
. w: B4 h$ M0 v/ N  简单函数定义示例如下:
* B0 f  o2 z# L8 w0 Yfunction SayHello
2 x+ `* Y* K8 v$ N' B' Q{& ]* M: j+ P( `. T0 Q5 ]) a
   "Hello"
& g) A% X% N: Z1 q}
/ m" Z( Q: k; B' Z2 q/ A函数调用方法与使用Cmdlet方法相似,输入SayHello,并回车。则结果为Hello。. x; T9 j- E: k) q" C8 ?% v

2 E+ C1 s. Y6 j脚本7 g* G1 {* Y; Z. t; ?. v# V& {
  脚本就是将一些命令存贮到文件文件中,并将该文本文件的扩展名设置为.ps1。脚本中除了可以使用常用cmdlet,控制流程的命令外,还可以定义和调用自定义函数,调用方法与调用cmdlet方法类似。$ s8 Y1 D% ~7 H* `: c: @
  脚本也可以有参数,既可以是命名参数也可以是匿名参数。在参数的使用上,脚本与函数非常相似。: H& }9 O4 N) u  g# T
  另外,PowerShell的脚本执行策略默认不允许执行任何脚本文件,修改执行策略可执行如下命令:Set-ExecutionPolicy RemoteSigned。需要谨记的是,修改执行策略会带来安全隐患,修改执行策略之前请三思。6 Y& C7 i* B/ w* Y8 y
  简单脚本d:\greet.ps1示例如下
6 M6 M$ J' v+ E7 m3 Z. uParam([String] somebody)* b3 M+ l% l4 C. T# ?& A/ ~, r
function Greet([String] name)4 v8 _1 j2 b6 n* x2 W" {2 D
{
1 S) ^9 f1 Z- g; l5 g' ~    "Hello $name" , [# M& g9 u2 K8 h. {1 O2 v
}
& ]: |& s& e% y5 W. ]* `3 }echo "Call function Greet ..."
0 w. ]5 G9 x# m& x  j7 W$ u: ^" RGreet $somebody6 A- x9 x0 F9 ^2 R3 g9 O9 ~
  脚本调用方法如下:
8 F; A9 ^* l5 [: y) L, H, `* {, pd:\greet.ps1 "Luke"
- u5 f' y4 ?, L' N% J' W$ P) A# y1 ?' A9 X- P* T6 y
.\greet.ps1 "Luke"6 ^2 \( z- A% A: |3 S7 n$ X) L
以上脚本的执行结果是,“Hello Luke”。
  a8 V5 S' S, c  ]. s9 K0 n) E
& Y, p' d5 [( O* j) ]作用域
& t7 k& Y# O' B$ P7 ~5 F  按类型分,有两种作用域:global(全局作用域)和script(脚本作用域)。启动PowerShell命令行后,所有命令行命令在全局作用域中运行。而脚本上下文在script作用域中运行,运行结束后脚本中定义的变量和函数不在可见。这是因为在脚本中定义的变量和函数默认位于script作用域中。当然也可以显示定义变量和函数的作用域,比如function global:fun1 (){…}。这样以来,脚本执行完之后,fun1还能够在全局作用域中执行。
1 c# @/ _/ N4 Y/ N  按轴关系分,可以有父作用域、本地作用域(当前作用域)和子作用域。这些不是新的作用域类型,而是作用域之间的相对关系。子作用域还可以有子作用域,这个层次可以很深。
8 e( w- U6 ^! I" G% ~$ v) _' q9 w& u  除了可以将脚本中的变量和函数定义在全局作用域中,还可以使用点".”获取来源,将一个普通脚本在本地作用域中执行,执行完毕退出脚本后,所有在脚本中定义的变量和函数,在本地作用域中继续可用。
, X( k; I! J) ^, r1 x; o# p' {  使用点".”获取来源示例如下:
8 n/ X& `0 u4 f, M( l& B. n" [. d:\greet.ps1 "Luke"
9 y: t& v0 L1 ]1 F7 U; e或者! ^8 Y; Y1 Y% K$ k
. .\greet.ps1 "Luke"
( Z# n2 q& h1 F3 s; b( y8 K即点".”,空格,然后是一般脚本执行方式。
! ^9 t& R: v  Y9 z& n2 w( X结语. b) w$ w# T( e
  函数、脚本和作用域,每个概念要说得详细都得要很大的篇幅。这里只简单说明它们的概念、彼此间的关系以及简单的用法。让读者有个大概的印象,能够拿来就用。, C" a, z1 I" u1 k8 k5 A

5 C! Q5 [# D; N% P" D! F$ \9 o9 `5 E9 ~0 g
/ i+ L1 ~3 t% S; p  ]2 m


深蓝 炉火纯青 2016-8-2 17:51 来自手机 |显示全部楼层

一个男人没有丰富的面部表情,不代表他没有丰富的内心世界。

赞助会员
热心回复。。
雾月 「出类拔萃」 2017-9-8 11:08 来自手机 |显示全部楼层

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

佛曰,色即是空,空即是色!今晚,偶想空一下
放我一个人生活 「出类拔萃」 2018-5-5 12:45 来自手机 |显示全部楼层

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

消灭0回复~#j319:
凉冬空巷 「龙战于野」 2018-5-5 21:29 来自手机 |显示全部楼层

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

  楼主,是你让我深深地理解了'人外有人,天外有天’这句话。谢谢你! #365:
您需要登录后才可以回帖 登录 | 注册账号  

本版积分规则

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

GMT+8, 2020-9-28 04:12 , Processed in 0.044746 second(s), 21 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表