2

假设我有如下结构:

[xml]$i = "
<root>
    <item>
        <id>1</id>
        <data>Content_Of_1</data>
    </item>
    <item>
        <id>2</id>
        <data>Content_Of_2</data>
<item>
    <id>5</id>
    <data>Content_Of_5</data>
</item>
    </item>
</root>
"

$foo = @(1,2,3)

我想选择 $i.root.item.data ,其中 $i.root.item.id 在 $foo 中。

要在数组中选择与 ID 匹配的节点,我可以执行以下操作:

($i.root.item | ? {$foo -contains $_.id})

但是由于某种原因,如果我尝试访问 $_.data,我什么也得不到:

($i.root.item | ? {$foo -contains $_.id}).data

为什么?

4

1 回答 1

1

但是由于某种原因,如果我尝试访问 $_.data,我什么也得不到:

($i.root.item | ? {$foo -contains $_.id}).data

您一无所获的原因是您试图访问整个集合中不存在的属性(数据)。您需要执行以下操作:

$i.root.item | ? {$foo -contains $_.id} | ForEach-Object { $_.data }

它访问每个对象的数据属性。您还可以为每个对象选择数据属性中的值:

$i.root.item | ? {$foo -contains $_.id} | Select-Object data

这将产生一个 PSCustomObjects 数组,其中每个对象将包含一个名为 data 的属性(与 ForEach-Object 示例中的字符串数组相反)。

请注意,在 Powershell 3.0 中,使用新的属性枚举功能,您的原始语法将产生所需的结果,因为枚举将自动完成。

于 2012-10-24T16:37:39.230 回答