2

私が経験しているいくつかの可変スコープ動作とはかなり混乱しています。次のサンプルモジュールを取ります。

$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をさらに実行すると、$ intTemplateは同じままで、$xmlTemplateにさらに多くの子要素が追加され続けます。$ myXmlが必ずしも単純なテスト/要素構造で開始されるとは限らない理由、さらに言えば、スクリプトのローカル$ xmlTemplate変数が変更されているように見えるのに、intTemplateは変更されていないように見える理由がわかりません。

ここで何が起こっているのかを理解するための支援をいただければ幸いです。

デビッド

4

1 に答える 1

1

私が理解している限り、スコープは問題とは何の関係もありません。書くとき$myInt=$script:intTemplateは値を操作するので、値をコピーします。書くとき$myxml = $script:xmlTemplateは参照を操作するので、参照をコピーすると、同じ基になるオブジェクトを操作します。試してみてください$script:intTemplate += 1

于 2012-11-14T04:35:26.790 に答える