読者です 読者をやめる 読者になる 読者になる

PowerShellで"="や":"区切りの設定ファイルを読み込む

XML形式の設定ファイルなんかも増えてきていますが、"="区切りの設定ファイルは今も良く見ると思います。

USERID = user01
PASSWORD = passw0rd
HOSTNAME = myhost.local


PowerShellでこのような設定ファイルを読み込みたい場合はImport-Csvのコマンドレット使うときれいに読み取れます。
上の設定ファイルをKeyとValueにヘッダーを設定して読んでみた例です。
"="以外の区切り文字の場合はDelimiterの引数を変更します。

Import-Csv -Path .\settings.txt -Header Key,Value -Delimiter "="

Key                 Value
---                 -----
USERID              user01
PASSWORD            passw0rd
HOSTNAME            myhost.local

キレイに読み込めているのですが、array形式なので、
ある項目を取得したい場合など、Key項目を使ってValueを読み込もうとすると少し使いづらい場合があります。


こんな時にはハッシュ変数使うと便利です。

下の例では$settingsというハッシュ変数を用意して、
そこにインポートしたCSVの項目をマッピングしてみます。

#ハッシュ変数定義
$settings = @{}
#インポートした項目をハッシュ変数にマッピングしながら格納
Import-Csv -Path .\settings.txt -Header Key,Value -Delimiter "=" | %{$settings.Add($_.Key.Trim(),$_.Value.Trim())}


こうすると以下のように直観的に設定内容を呼び出せます。

>$settings.USERID
user01
>$settings.PASSWORD
passw0rd
>$settings.HOSTNAME
myhost.local


(追記)
最新のPSの場合は、ConvertFrom-StringDataコマンドレットを使えばもっと簡単に書けました。

$settings = Get-Content .\settings.txt | ConvertFrom-StringData

ただし上記の場合はHashTableになるのに対し、こちらの方法ではObjectの配列になります。
PSのVer2.0などではオブジェクトの配列に対して「$object.要素名」といった使い方ができないので注意してください。