我在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()
答案 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