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.id が $foo にある $i.root.item.data を選択します。

配列内の 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

これにより、各オブジェクトに data という名前の単一のプロパティが含まれる PSCustomObjects の配列が生成されます (ForEach-Object の例のような文字列配列とは対照的です)。

Powershell 3.0 では、新しいプロパティ列挙機能を使用すると、列挙が自動的に行われるため、元の構文で目的の結果が得られることに注意してください。

于 2012-10-24T16:37:39.230 に答える