【PowerShell】XMLから目的の要素を取得する

PowerShell

よく自作ツールなどの設定ファイルとして利用するため、備忘録として記録します。

概要

PowerShell で XML ファイルを読み込み、Get-Content を使用して目的の要素を取得する方法を紹介します。

引数も利用できるようにしてバッチファイルから呼び出せば、バッチファイルからでも自由にXML ファイルの要素を読み取れるようになります。活用の幅が広がりますので大変な方法です。

サンプルコード

XML ファイル(config.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Config>
  <General>
    <Account1>
      <PCName>name1</PCName>
      <ADName>hoge</ADName>
      <ADAccountName>hoge\name1</ADAccountName>
    </Account1>
    <Account2>
      <PCName>name2</PCName>
      <ADName>hoge</ADName>
      <ADAccountName>hoge\name2</ADAccountName>
    </Account2>
  </General>
</Config>

ps1 ファイル

#config.xmlのパス
$ConfigPath = ".\config.xml"

#取得したい要素
$NodeName = "/Config/General/Account1/PCName"

#XMLを読み込む
$XML = [XML](Get-Content $ConfigPath)

$XML.SelectNodes($NodeName) | Set-Variable node
$node."#text"

詳細

$NodeName を「/Config/General/Account1/PCName」とした場合

以下の例では「Config」-「General」-「Account1」-「PCName」に記述されている「name1」を取得しています。

config.xml が同じフォルダー内にあると仮定しまして、読み込みたい xml ファイルのパスを変数に保存します。

#config.xmlのパス
$ConfigPath = ".\config.xml"

取得したい要素の「\」区切りで階層通りになるように入力します。

#取得したい要素
$NodeName = "/Config/General/Account1/PCName"

上記で指定した XML ファイルを Get-Content で読み込みます。読み込む際に XML にキャストします。

#XMLを読み込む
$XML = [XML](Get-Content $ConfigPath)

上記で指定した「”/Config/General/PCName”」の要素を $XML.SelectNodes で検索し、その結果を node 変数に保存します。
その後、 $node."#text" でテキストデータとして出力しています。

#指定した要素で検索する
$XML.SelectNodes($NodeName) | Set-Variable node
$node."#text"

その他、指定する要素を変更すると、様々な結果を取得することができます。

$NodeName を「//PCName」とした場合

要素名が「PCName」となっているものを $XML.SelectNodes で取得します。
XML ファイル内に該当するものが2つありますので、配列として結果が返ってきます。

配列ですので、$node[0]."#text" とすれば、「name1」のみ取得することができます。

$NodeName を「//Account1」とした場合

要素名が「Account1」となっているものとその子要素を $XML.SelectNodes で取得します。

下図のようなオブジェクトで返ってきますので、単純に $node."#text" ではテキストとして取得はできません。

$node."PCName" とすることで取得できます。

上記の場合 “#text” はいりません。
子要素のない要素を取得した場合に「#text」という名称がつけられるようです。

おわりに

PowerShell で XML ファイルを読み込み、Get-Content を使用して目的の要素を取得する方法を紹介しました。単純にしていた要素を取得したい場合は $XML.Config.General.Account1.PCName とするだけで取得できますので、用途に合わせて使い分けてもらえたらと思います。

タイトルとURLをコピーしました