よく自作ツールなどの設定ファイルとして利用するため、備忘録として記録します。
概要
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
とするだけで取得できますので、用途に合わせて使い分けてもらえたらと思います。