web-dev-qa-db-ja.com

PowershellでXMLを反復処理する方法は?

この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を変数に入れるためにこれをしています:

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

ここで、_$serviceStatePath_は上記のxmlファイル名です。それから私は次のようなことができると思った:

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

この例では、SQL Server (MSSQLSERVER)で出力される文字列が必要です

32
Mark Allison

PowerShellには、XMLおよびXPath関数が組み込まれています。 XPathクエリでSelect-Xmlコマンドレットを使用して、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'}
40
mswietlicki

[xml]キャストなしでも実行できます。 (xpathはそれ自体が世界です。 https://www.w3schools.com/xml/xml_xpath.asp

$xml = (select-xml -xpath / -path stack.xml).node
$xml.objects.object.property

または、これだけで、xpathは大文字と小文字を区別します。両方の出力は同じです。

$xml = (select-xml -xpath /Objects/Object/Property -path stack.xml).node
$xml


Name         Type                                                #text
----         ----                                                -----
DisplayName  System.String                                       SQL Server (MSSQLSERVER)
ServiceState Microsoft.SqlServer.Management.Smo.Wmi.ServiceState Running
DisplayName  System.String                                       SQL Server Agent (MSSQLSERVER)
ServiceState Microsoft.SqlServer.Management.Smo.Wmi.ServiceState Stopped
1
js2010