設定ファイルとしてXMLファイルを読みたいなーと思って試してみました。
多次元の設定を用意にかけるので便利ですね。
かなり適当なXMLを用意しました。
雰囲気はサーバーごとのアプリケーションログを集めるみたいな…
<root>
<Server>
<Name>Server1</Name>
<APP name="IIS" Log="C:\Iis\Log" />
<APP name="SQL" Log="C:\SqlServer\Log" filter="*.xml" />
</Server>
<Server>
<Name>Server2</Name>
<APP name="Tomcat" Log="C:\Tomcat\Log" />
</Server>
</root>
まずはXMLオブジェクト(XmlDocument)をファイルから作成
$path = 'C:\confitg.xml' $config = [xml]( Get-Content $path)
ここで$configを見ると、こんな感じです。
> $config root ---- root
では、、
> $config.root
Server
------
{Server, Server}
Server階層に2つのServerが見えます。型を確認してみると…配列です。
> $config.root.Server.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array
オブジェクト配列で出来たツリーみたいな感じでシンプルです。
> $config.root.Server[0] | Format-List
ServerName : AAA
APP : {IIS, SQL}
子のない要素は文字列です。数値ならIntとかになるんでしょうね、たぶん。
> $config.root.Server[0].ServerName.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object
属性があると、ちょっと違うみたいでした。
> $config.root.Server[0].APP[0].GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False XmlElement System.Xml.XmlLinkedNode
属性にアクセスする場合も同じ要領です。
> $config.root.Server[0].APP[0].name IIS > $config.root.Server[0].APP[0].Log C:\Iis\Log
Push-Location (Split-Path ( & { $myInvocation.ScriptName } ) -parent)
$path = '.\confitg.xml'
# XmlDocument取得
$config = [xml]( Get-Content $path)
# Serverレベルを巡回
$config.root.Server | % {
$server = $_
"ServerName : $($server.ServerName)"
# APP巡回
$server.APP | % {
$app = $_
"APP"
" Name : $($app.name)"
" Log : $($app.Log)"
# 存在しない属性は NULLになる。
if( $app.filter -eq $null ){
" Filter : null"
}
else{
" Filter : $($app.filter)"
}
}
}
かなり適当ですが、こんな感じです。
本当はもっといろいろできますが、設定ファイルレベルならこの程度で十分かと…