了解 Powershell 变量范围

Understanding Powershell variable scope

我试图了解变量如何保留值和范围。为此,我创建了两个简单的脚本。

低级脚本如下所示

param(
    $anumber=0
)

function PrintNumber
{
    Write-Host "Number is $anumber"
    $anumber++
    Write-Host "Number is now $anumber"
}

顶级脚本如下所示

$scriptPath=(Split-Path -parent $PSCommandPath)+"\" + "calledscript.ps1"
#dot source the called script
. $scriptPath 22

for($i=0;$i -lt 10;$i++)
{
    PrintNumber
}

主脚本 'dot sources' 被调用的脚本一次,在开始时传入一个值“22”。然后我从顶级脚本中调用 PrintNumber 函数 10 次。我认为输出看起来像:

人数是22 现在号码是 23

人数是23 现在号码是 24

人数是24 号码现在是 25

但函数调用时数字始终为 22,(输出如下)。为什么这个数字每次都重置为 22,即使我只引入了一次点源脚本并在那里将数字初始化为 22?

人数是22 现在号码是 23

人数是22 现在号码是 23

人数是22 现在号码是 23

谢谢

(请忽略错别字)

这是因为变量继承。 Technet 是这样解释的。

A child scope does not inherit the variables, aliases, and functions from
the parent scope. Unless an item is private, the child scope can view the
items in the parent scope. And, it can change the items by explicitly 
specifying the parent scope, but the items are not part of the child scope.

由于脚本是点源的,因此它创建了一个会话本地变量。当函数访问同名变量时,它可以从父作用域读取该变量,但随后会创建一个本地副本,该副本随后会递增并随后被销毁。