主題の通り、Powershellを使用した設定ファイルの読み込んで変数に格納して使う方法のメモ。
日本語でググってもまとまった情報がないのでまとめる。
環境
PS C:\>
PS C:\> "$((get-wmiobject win32_operatingsystem).caption) ($((get-wmiobject win32_operatingsystem).version))"
Microsoft Windows 10 Pro (10.0.10586)
PS C:\>
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 0 10586 122
設定ファイルの読み込み方
propertiesファイル
key=valueな形式のファイルから値を読み取る場合にはConvertFrom-StringDataコマンドレットを利用する*1
PS C:\>
PS C:\> $conf = Get-Content $confPath -Raw | ConvertFrom-StringData
PS C:\>
PS C:\> $conf.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Hashtable System.Object
PS C:\>
PS C:\> $conf.key
value
PS C:\>
PS C:\> $conf.'hoge.key'
value
XMLファイルから値を読み取る場合にはxml型にキャストする。*2
*3
PS C:\>
PS C:\> [xml]$conf = Get-Content $confPath
PS C:\>
PS C:\> $conf.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False XmlDocument System.Xml.XmlNode
PS C:\>
PS C:\> $conf.catalog
book
----
{book, book, book, book...}
PS C:\>
PS C:\> $conf.catalog.book[0].id
bk101
PS C:\>
PS C:\> $conf = [xml](Get-Content $confPath)
参考
JSON形式のファイルから値を読み取る場合にはConvertFrom-Jsonコマンドレットを利用する*4。
以下のような設定ファイルがあったとする。
{
"Address": 0,
"AddressFamily": 2,
"ScopeId": null,
"IsIPv6Multicast": false,
"IsIPv6LinkLocal": false,
"IsIPv6SiteLocal": false,
"IsIPv6Teredo": false,
"IsIPv4MappedToIPv6": false,
"IPAddressToString": "0.0.0.0"
}
PowerShell で JSON をファイル入出力 する - tech.guitarrapc.cóm
上記の読み込みは以下のように書ける
PS C:\>
PS C:\> $conf = Get-Content $confPath | ConvertFrom-Json
PS C:\>
PS C:\> $conf.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
PS C:\>
PS C:\> $conf.Address
0
CSV形式のファイルから値を読み取る場合にはConvertFrom-Csvコマンドレットを利用する*5
以下のような設定ファイルがあったとする
value1-1,value2-1,value3-1
value1-2,value2-2,value3-2
上記の読み込みは以下のように書ける
PS C:\>
PS C:\> $conf = Get-Content $confPath | ConvertFrom-Csv -Header "name1","name2","name3"
PS C:\>
PS C:\> $conf.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS C:\>
PS C:\> $conf.name1
value1-1
value1-2
PS C:\>
PS C:\> $conf[0]
name1 name2 name3
----- ----- -----
value1-1 value2-1 value3-1
PS C:\>
PS C:\> $conf[0].name1
value1-1
Delimiterパラメーターで区切り記号を指定したりできる
また、Headerパラメーターを指定しない場合は一行目がヘッダとして扱われる。
※Import-Csvというコマンドもあるが、個人的にConvertFrom*でそろえたほうがシェルが読みやすいと思うのでこちらを推奨。
その他
整理してみた感想は以下の通り。