2013-08-29 31 views
27

私は、テキストファイルにこのXML文書を持っている:PowershellでXMLを反復処理する方法は?

<?xml version="1.0"?> 
<Objects> 
    <Object Type="System.Management.Automation.PSCustomObject"> 
    <Property Name="DisplayName" Type="System.String">SQL Server (MSSQLSERVER)</Property> 
    <Property Name="ServiceState" Type="Microsoft.SqlServer.Management.Smo.Wmi.ServiceState">Running</Property> 
    </Object> 
    <Object Type="System.Management.Automation.PSCustomObject"> 
    <Property Name="DisplayName" Type="System.String">SQL Server Agent (MSSQLSERVER)</Property> 
    <Property Name="ServiceState" Type="Microsoft.SqlServer.Management.Smo.Wmi.ServiceState">Stopped</Property> 
    </Object> 
</Objects> 

私は、各オブジェクトを反復処理し、DisplayNameServiceStateを見つけたいです。どうすればいい?私はあらゆる種類の組み合わせを試してみて、それを解決するために苦労しています。

私は変数にXMLを取得するためにこれをやっている:

$serviceStatePathは、上に示したxmlファイル名です

[xml]$priorServiceStates = Get-Content $serviceStatePath;

foreach ($obj in $priorServiceStates.Objects.Object) 
{ 
    if($obj.ServiceState -eq "Running") 
    { 
     $obj.DisplayName; 
    } 
} 

そして、この例では、私はSQL Server (MSSQLSERVER)

答えて

31

PowerShellが組み込まれているXMLおよびXPathの関数で出力された文字列をたい:私は、私のような何かができると思いました。 Select-Xmlコマンドレットを使用してXPathクエリでXMLオブジェクトからノードを選択し、 .Node。ノード値にアクセスするには '#text'を使用できます。

[xml]$xml = Get-Content $serviceStatePath 
$nodes = Select-Xml "//Object[Property/@Name='ServiceState' and Property='Running']/Property[@Name='DisplayName']" $xml 
$nodes | ForEach-Object {$_.Node.'#text'} 

か短い

[xml]$xml = Get-Content $serviceStatePath 
Select-Xml "//Object[Property/@Name='ServiceState' and Property='Running']/Property[@Name='DisplayName']" $xml | 
    % {$_.Node.'#text'} 
+4

私はいくつかの説明を追加しました。 – mswietlicki

+1

おなじみのプロパティ構文を使用してドキュメントを移動することもできます。 '($ xml.Objects.Object |?{$ _。ServiceState -eq" Running "})。DisplayName' – zneak