我现在被powershell的变量作用域搞昏了。。。


PowerShell交流中心分类: 变量-函数-脚本-条件-循环-参数我现在被powershell的变量作用域搞昏了。。。
0
RozenAnnie asked 10 年 ago

第二段代码输出的是2,为什么第一段代码是每秒钟输出一个1?
1、

function main{$r=1;loop}
function loop{
while($true)
{func;$r;$global:r;start-sleep -seconds 1}
 }
 function func{$global:r=2}
 main

2、

function loop{
while($true)
{func;$r;start-sleep -seconds 1}
 }
 function func{$global:r=2}
 $r=1;loop

我不明白为什么第一段代码中$r已经设为了global了,但在while循环内仍然没改变,是不是不应该用global?

1 Answers
1
Best Answer
Mooser Lee 管理员 answered 10 年 ago

$r和 $global:r是两个不同的变量,不能因为$global:r设置了全局,所有的$r就都是$global:r的值了。
当你设置了$global:r,你必须使用$global:r才能读到它的值。
高作用域的值可以被贯穿进低作用域。
但是低作用域却不能直接修改高作用域。

请看示例1:

$var='pstips'
function func ()
{
 "函数内修改前:$var"
  $var='pstips.net'
 "函数内修改后:$var"
}
func 
"函数外:$var"

请看示例2:

$global:var='pstips'
function func ()
{
 "函数内修改前的本地变量被贯穿:$var"
  $var='pstips.net'
 "本地变量修改后,全局变量保持不变:$global:var"

  $global:var='pstips.net'
 "用global修饰符修改全局变量,全局变量被改变:$global:var"
}
func

 

RozenAnnie replied 10 年 ago

谢谢 总算搞懂了。

RozenAnnie replied 10 年 ago

看来我之前使用global时一直用错了。因为比如说再你的示例2中,如果在func中执行$global:var=’pstips.net’,然后在函数func内外使用write-host $var,结果都是pstips.net,因此之前一直误以为可以混用。。