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" "パスワード"