PowerShell設定ファイルの読み込み

PowerShellで外部設定ファイルを読み込む

PowerShellでは、CSVファイル関連処理やXMファイル関連処理が標準ライブラリで利用できます。

つまり、CSVやXMLで記述した設定ファイルを容易に扱うことができます。

独自の設定ファイル形式を作成するより、XML形式など汎用性のある形式を採用したほうがよいといえます。


単純な設定ファイルの読み込み

設定ファイル

「パラメータ名=値」というini形式のような設定ファイルを用意します。


; configure
name1=value1
name2=value2,value3
name3=value4 value5

スクリプト

設定ファイルを読み込み、行ごとにキーと値を取得します。

なお、「;」文字をコメントとみなします。


function read_ini($filename)
{
  $lines = get-content $filename
  foreach($line in $lines){
    # コメントと空行を除外する
    if($line -match "^$"){ continue }
    if($line -match "^\s*;"){ continue }

    $param = $line.split("=",2)
    write-host("key : " + $param[0])
    write-host("val : " + $param[1])
  }
}

read_ini ".\config.ini"

CSVファイル読み込み処理

CSVファイル

CSVファイルに定義情報を記述します。


# Comma Separeted Values
name,    value,  comment
"item1",     1,  "test item"
"item2",     3,  ""
"item3",     5,  "sample"

スクリプト

PowerShellでは、読み込んだCSVファイルをハッシュに変換することができます。


function get_value($filepath, $data_name)
{
    $hash = @{}

    # ファイルの存在を確認する
    if((Test-Path $filepath) -eq $false){
        write-host("ERROR: Not found CSV-File: " + $filepath)
        return ""
    }

    # CSVファイルを読み込んで、ハッシュに変換する
    Import-Csv $filepath | ForEach-Object {$hash.Add($_.name, $_)}

    # キーが存在しているか確認する
    if($hash.ContainsKey($data_name) -ne $true){
        write-host("ERROR: Not found : " + $data_name)
        return ""
    }

    # value項目を返す
    return $hash[$data_name].value
}

$filepath = ".\config.csv"
$data_name = "item2"

# 名前に対応する値を取得する
$val = get_value $filepath $data_name
write-host($data_name + ":" + $val)

XMLファイル読み込み処理

XMLファイル

XMLファイルに定義情報を記述します。


<?xml version="1.0"?>
<config>
  <data>
    <name>"item1"</name>
    <value>"value1"</value>
  </data>
  <data>
    <name>"item2"</name>
    <value>"value2"</value>
  </data>
  <data>
    <name>"item3"</name>
    <value>"value3"</value>
  </data>
</config>

スクリプト

PowerShellでは、XMLタイプにキャストして参照するだけでXMLファイルを扱うことができます


$CWD = Split-Path $MyInvocation.MyCommand.Path -parent
$filename = "$CWD\config.xml"

$conf_info = [xml](Get-Content $filename)
foreach($data in $conf_info.config.data){
    write-host("name : " + $data.name)
    write-host("value: " + $data.value)
}

関連ページ