那天放学的时候人很多。楼道很挤,你的手不小心碰到了我的手背,这是我漫长而又短暂的初恋。 收藏本站
登陆 / 注册 搜索

阅读: 7.6K   回复: 4

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

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

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

本帖最后由 soarcloud 于 2016-8-2 21:26 编辑   S/ l. S8 l! l3 N
/ F: G5 p% g3 w) O) K$ b
  脚本所体现的是PowerShell的编程特性,是任务自动化的基础。函数是比脚本粒度更细的代码复用单元,可以定义在命令行中或者脚本中。作用域就是变量和函数的作用范围,是执行上下文的划分。6 d& {$ L% a1 O' M. v  _' |  ^/ V5 }
+ T0 Y. f  N$ D  \1 n- w
函数* G+ z1 f& F6 c
  函数就是命名的命令列表,与一般编程语言中的函数概念具有相同的范畴。函数中不但可以有简单命令,还可以有控制流程的命令,如if、while、switch等。函数可以有匿名参数或者命名参数列表。命令参数列表可以用大括号或者Param关键字定义。匿名函数可以使用$Args变量来访问。函数也可接收来自管道的对象作为输入,管道对象可以通过$input变量类访问。% V1 d9 n: L: h9 Y6 q9 U0 e' g
  在脚本中定义的函数,可以定义在#require命令和Param关键字之后的任何位置,但要定义在调用之前。还有,自定义的函数不会自动运行,需要被明确调用。可以使用filter或者function定义函数,用filter关键字定义的函数比较简单,而使用function关键字定义的函数可以有更加复杂的功能。 ( u4 v; p- p9 x1 Z. o9 y, h
  简单函数定义示例如下:: B, `+ r8 ~' c$ ?7 F! D
function SayHello
6 G2 }+ R4 |4 Q/ i{6 L  q- ]4 y( w) V
   "Hello"" K' E+ N/ r6 F1 R
}
( I5 P5 P* T) ~  |9 J函数调用方法与使用Cmdlet方法相似,输入SayHello,并回车。则结果为Hello。# F, M2 d8 A0 {  U% j
* K$ _5 `2 J& [2 G. `
脚本2 o# ^0 a" {8 ]4 M% @: a4 b
  脚本就是将一些命令存贮到文件文件中,并将该文本文件的扩展名设置为.ps1。脚本中除了可以使用常用cmdlet,控制流程的命令外,还可以定义和调用自定义函数,调用方法与调用cmdlet方法类似。
% C: f* w9 R$ v; m  脚本也可以有参数,既可以是命名参数也可以是匿名参数。在参数的使用上,脚本与函数非常相似。4 ^7 Q( o4 h9 F- m
  另外,PowerShell的脚本执行策略默认不允许执行任何脚本文件,修改执行策略可执行如下命令:Set-ExecutionPolicy RemoteSigned。需要谨记的是,修改执行策略会带来安全隐患,修改执行策略之前请三思。
: b+ J3 Y2 K, m( Y$ `  简单脚本d:\greet.ps1示例如下) B: {, z; X% j5 m# A) Y/ J
Param([String] somebody)' A- v5 }' a% U! V' z
function Greet([String] name)9 R0 J7 x8 \5 C9 O+ u4 r  N
{% _5 M) ?0 L# V& B3 e* l
    "Hello $name" ( v3 ^- P1 |2 @4 W, z
}
. I. x9 ]' M, H8 D( Eecho "Call function Greet ..."
% [8 C$ m: ^$ }5 R1 cGreet $somebody, O; K7 r  ]) ]. t
  脚本调用方法如下:- V* H& q5 a3 S4 \6 i
d:\greet.ps1 "Luke"
, K& J# I; T. `6 x. q' c; E# i
( u+ N$ x9 k2 B& h3 N.\greet.ps1 "Luke"" a! y/ R6 o) r0 A3 a! ?, f
以上脚本的执行结果是,“Hello Luke”。
4 z# p( Z! h$ j! I4 C4 o
& p" Q. Y) G. ?作用域1 l1 r# f$ p+ D9 {4 Z- v
  按类型分,有两种作用域:global(全局作用域)和script(脚本作用域)。启动PowerShell命令行后,所有命令行命令在全局作用域中运行。而脚本上下文在script作用域中运行,运行结束后脚本中定义的变量和函数不在可见。这是因为在脚本中定义的变量和函数默认位于script作用域中。当然也可以显示定义变量和函数的作用域,比如function global:fun1 (){…}。这样以来,脚本执行完之后,fun1还能够在全局作用域中执行。; h5 l; d' u7 v& P4 m
  按轴关系分,可以有父作用域、本地作用域(当前作用域)和子作用域。这些不是新的作用域类型,而是作用域之间的相对关系。子作用域还可以有子作用域,这个层次可以很深。$ Q: M# K- N; W8 i
  除了可以将脚本中的变量和函数定义在全局作用域中,还可以使用点".”获取来源,将一个普通脚本在本地作用域中执行,执行完毕退出脚本后,所有在脚本中定义的变量和函数,在本地作用域中继续可用。8 s' p9 ?" \2 |: T% c( s8 ^
  使用点".”获取来源示例如下:4 h. F2 v; u6 A. b) i; e9 x- _+ x
. d:\greet.ps1 "Luke"/ J, I4 ]- E( P: ^& ?
或者
7 L$ @6 R8 g/ b; R/ i3 i5 t. .\greet.ps1 "Luke"+ d$ p9 Q# B1 S1 U7 D& [# a6 E
即点".”,空格,然后是一般脚本执行方式。
+ [3 _. U2 [7 F; f" ]. E/ y8 N结语
/ V. {" P' e; B" X: Y/ Z  函数、脚本和作用域,每个概念要说得详细都得要很大的篇幅。这里只简单说明它们的概念、彼此间的关系以及简单的用法。让读者有个大概的印象,能够拿来就用。. G+ E  y: F6 s* R! C. {1 V

5 k. {" E4 x7 K* c
/ ~) ~' e( k. e; l* c6 S
4 u1 M: Z6 t  z' R& {5 t! y9 z- X
上一篇
下一篇
soarcloud发帖没看黄历,被扣了1 个 金币.


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

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

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

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

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

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

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

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

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

本版积分规则

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

GMT+8, 2021-10-27 18:12 , Processed in 0.023019 second(s), 20 queries , Redis On.

© 2015-2021 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表