設定ファイルとして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)" } } }
かなり適当ですが、こんな感じです。
本当はもっといろいろできますが、設定ファイルレベルならこの程度で十分かと…