模块范围变量在没有显式赋值的情况下被更改

时间:2012-11-13 20:28:12

标签: powershell powershell-v3.0

我对我正在经历的一些变量范围行为感到困惑。采取以下示例模块:

$script:intTemplate = 1

[xml]$script:xmlTemplate = @"
<test>
    <element>
    </element>
</test>
"@

function getvar {
    $myint = $script:intTemplate
    $myint++
    Write-output "Myint is $myint while intTemplate is $intTemplate"

    $myxml = $script:xmlTemplate
    $e = $myxml.CreateElement("MyChildElement")
    $myxml.SelectSingleNode("/test").AppendChild($e) |Out-Null
    $myxml.Innerxml.tostring()
    $script:xmltemplate.Innerxml.tostring()
}    

现在导入该模块正在运行getvar生成:

PS C:\Windows\system32> getvar
Myint is 2 while intTemplate is 1
<test><element></element><MyChildElement /></test>
<test><element></element><MyChildElement /></test>

getvar的进一步运行继续向$ xmlTemplate添加越来越多的子元素,而$ intTemplate保持不变。我不明白为什么$ myXml并不总是从简单的测试/元素结构开始,更重要的是,当intTemplate没有时,脚本局部$ xmlTemplate变量似乎被改变了。

任何有关弄清楚这里发生的事情的帮助都会非常感激。

大卫

1 个答案:

答案 0 :(得分:1)

据我所知,范围与您的问题无关,当您编写$myInt=$script:intTemplate时,您操纵一个值,因此您复制该值。当您编写$myxml = $script:xmlTemplate时,您操作引用,因此复制引用时,您将使用相同的基础对象。试试$script:intTemplate += 1