奇怪的行为 - > .GetEnumerator()| .Reset() - >寻找方法

时间:2017-04-17 12:10:53

标签: xml powershell enumerator

我在PowerShell中使用一个简单的XML文件,因为我使用GetEnumerator()方法,在使用我的脚本时会看到一些奇怪的东西。当我使用GetEnumerator()方法在对象中保存某些内容时,我只能使用该对象一次。之后我必须重置才能再次使用它。

我想摆脱这种行为。下面是一个示例脚本,它基本上显示了我在脚本中如何使用它。在函数的真实脚本中,我经常使用变量$ControlObject,每次都必须重置它。

如何以简单的方式防止这种情况发生?

$XMLTargetPath = Join-Path -Path $PSScriptRoot -ChildPath "XMLConfig.xml"

# Save XML in File for easy and fast reproduction
$XMLContentForFile = [xml]@"
<OuterNode>
  <BaseSettings>
    <Setting1>Blabla</Setting1>
  </BaseSettings>
  <DynamicSettings>
    <item>
        <Number>1</Number>
        <Name>January</Name>
    </item>
    <item>
        <Number>2</Number>
        <Name>February</Name>
    </item>
  </DynamicSettings>
</OuterNode>
"@
$XMLContentForFile.Save($XMLTargetPath)

function MyFunction {
    Param(
        [Parameter(Mandatory=$true, Position=0)]
        $ControlObject
    )

    $ControlObject     # Output the Object
    $ControlObject     # PROBLEM - I get no output ...

    # I need to make a reset to output the object again ...
    $ControlObject.Reset()
    $ControlObject
}

[xml]$xml = Get-Content -Path $XMLTargetPath

# Pass the XML-Node "Dynamic-Settings" into Function
MyFunction -ControlObject $xml.OuterNode.DynamicSettings.GetEnumerator()

1 个答案:

答案 0 :(得分:1)

我认为你误解了枚举器和PowerShell默认输出是如何工作的。用于输出处理的PowerShell automagically appends | Out-Default

  

它调用引擎获取提示,然后显示它并收集用户输入。然后它接受该输入,连接| Out-Default并将其提交给引擎执行。 ...是,在封面下,通过控制台主机输入的每个命令都通过管道传送到Out-Default

然而,管道会自动展开枚举器(否则它将无法显示枚举或可枚举集合的元素)。因此,只是回显变量与循环enumerator

基本相同
while ($ControlObject.MoveNext()) {
    $ControlObject.Current
}

在输出操作之后,枚举器位于枚举的末尾,因此您需要先将其移动到开头,然后才能再次枚举元素。这就是Reset()所做的。

为什么管道不会自动重置枚举?我不知道,但可能不会产生无限循环。

底线:你不能吃蛋糕也吃。需要展开枚举,以便显示元素,并且由于枚举不会自动重置,因此您需要在自己再次枚举元素之前自己执行此操作。

如果您只想要所选节点的嵌套元素,则应该使用ChildNodes属性而不是枚举器。

MyFunction -ControlObject $xml.OuterNode.DynamicSettings.ChildNodes