この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>
_
各オブジェクトを反復処理して、DisplayName
とServiceState
を見つけたいです。どうすればいいですか?私はあらゆる種類の組み合わせを試しましたが、うまくいくのに苦労しています。
XMLを変数に入れるためにこれをしています:
_[xml]$priorServiceStates = Get-Content $serviceStatePath;
_
ここで、_$serviceStatePath
_は上記のxmlファイル名です。それから私は次のようなことができると思った:
_foreach ($obj in $priorServiceStates.Objects.Object)
{
if($obj.ServiceState -eq "Running")
{
$obj.DisplayName;
}
}
_
この例では、SQL Server (MSSQLSERVER)
で出力される文字列が必要です
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'}
[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