我试图理解变量如何保留值和范围。为此,我创建了两个简单的脚本。
低级脚本看起来像这样
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
}
主要剧本'点源'被调用的脚本一次,在开始时传递一个值," 22"。然后,我从顶级脚本中调用PrintNumber函数10次。我认为输出看起来像:
数字是22 号码现在是23
数字是23 号码现在是24
数字是24 号码现在是25
但是调用函数时,数字总是22,(输出如下)。为什么这个数字每次重置为22,即使我只在一个点源脚本中拉了一次并将数字初始化为22?
数字是22 号码现在是23
数字是22 号码现在是23
数字是22 号码现在是23
由于
(请忽略任何拼写错误)
答案 0 :(得分:0)
这是因为变量继承。 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.
由于脚本是点源的,因此会创建一个本地会话变量。当函数访问具有相同名称的变量时,它可以从父作用域读取变量,但随后它会创建一个本地副本,然后递增并随后销毁。