設定ファイルとしてXMLファイルを読みたいなーと思って試してみました。
多次元の設定を用意にかけるので便利ですね。

サンプル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)"
        }
    }
}

かなり適当ですが、こんな感じです。
本当はもっといろいろできますが、設定ファイルレベルならこの程度で十分かと…

タグ:

powershell
最終更新:2013年07月17日 11:34