PowerShellで設定ファイルの内容をコンソールとファイルに出力するようにしてみた

スクリプトを実行する際に設定ファイルの内容をコンソールで確認出来るようにしたらミスも防げるしいいかなーと思って考えてみた. ついでにtsvで出力出来るようにした.

スクリプト

設定ファイルはこんな感じ. PowerShellでは-Option Constantで定数を宣言できる. 変数の内容は-Descriptionで書く.

Get-Variableで変数の一覧を取得出来るがいらないものまで色々出てきてしまう(気になる人は手元でお試しあれ). そこで-Descriptionの先頭にタグを付けることでユーザー定義の変数かそうでないかを判別するようにした.

あとはFormat-Tableでコンソールに表示して, Export-Csvでファイル出力すれば出来上がり.

Config.ps1

# タグ
Set-Variable -Name UserDefinedVarTag -Value "UserDefinedVars:" -Option Constant
# サンプルフラグ
Set-Variable -Name IsSample -Value $true -Option Constant -Description ("{0}サンプルフラグ" -f $UserDefinedVarTag)
# スクリプトのパス
Set-Variable -Name ConfRoot -Value (Split-Path $MyInvocation.MyCommand.Path -Parent) -Option Constant -Description ("{0}スクリプトのパス" -f $UserDefinedVarTag)
# サンプルディレクトリ
Set-Variable -Name SampleDir -Value ("{0}\Sample" -f $ConfRoot) -Option Constant -Description ("{0}サンプルディレクトリ" -f $UserDefinedVarTag)
# ユーザー名
Set-Variable -Name UserName -Value "TestUser" -Option Constant -Description ("{0}ユーザー名" -f $UserDefinedVarTag)
# ユーザーパスワード
Set-Variable -Name UserPassword -Value "PaSsWoRd" -Option Constant -Description ("{0}パスワード" -f $UserDefinedVarTag)
# 設定ファイルの出力パス
Set-Variable -Name ConfFilePath -Value ("{0}\Config.tsv" -f $ConfRoot) -Option Constant -Description ("{0}設定ファイル内容出力先" -f $UserDefinedVarTag)

function Write-Config(){
    <#
    .SYNOPSIS
    設定内容をコンソールに出力します.
    #>

    $vars = @()
    Get-Variable | ForEach-Object{ if($_.Description -ne $null -and $_.Description.Contains($UserDefinedVarTag)) { $vars += $_ } }
    $vars | ForEach-Object{ $_.Description = $_.Description.Split(":")[1] }
    $vars | Select-Object -Property @{n="変数名"; e={$_.Name}}, @{n="値"; e={$_.Value}}, @{n="詳細"; e={$_.Description}} | Format-Table
    $vars | Select-Object -Property  @{n="変数名"; e={$_.Name}}, @{n="値"; e={$_.Value}}, @{n="詳細"; e={$_.Description}} | Export-Csv -Delimiter "`t" -Encoding default -Path $ConfFilePath -NoTypeInformation
}

設定ファイルを読み込んだスクリプトで関数を呼び出す.

Write-Config.ps1

set-variable -name ScriptRoot -value (Split-Path $MyInvocation.MyCommand.Path -Parent) -option Constant

# 設定ファイル読み込み
. ("{0}\Config.ps1" -f $ScriptRoot)

Write-Config

実行してみるとコンソールに設定内容がきれいに表示される.

PS D:\Sample> .\Write-Config.ps1

変数名       値                                             詳細
------       --                                             ----
ConfFilePath D:\Common\PowerShell\Modules\Sample\Config.tsv 設定ファイル内容出力先
ConfRoot     D:\Common\PowerShell\Modules\Sample            スクリプトのパス
IsSample     True                                           サンプルフラグ
SampleDir    D:\Common\PowerShell\Modules\Sample\Sample     サンプルディレクトリ
UserName     TestUser                                       ユーザー名
UserPassword PaSsWoRd                                       パスワード

ファイルにも出力される.

"変数名"  "値"   "詳細"
"ConfFilePath"  "D:\Common\PowerShell\Modules\Sample\Config.tsv"    "設定ファイル内容出力先"
"ConfRoot"  "D:\Common\PowerShell\Modules\Sample"   "スクリプトのパス"
"IsSample"  "True"  "サンプルフラグ"
"SampleDir" "D:\Common\PowerShell\Modules\Sample\Sample"    "サンプルディレクトリ"
"UserName"  "TestUser"  "ユーザー名"
"UserPassword"  "PaSsWoRd"  "パスワード"