$PSBoundParameters によるパラメターチェック [PowerShell]
Windows PowerShell Blog の下記リンクの記事を見て
Version 2 から追加された $PSBoundParameters の使い方を知りました。
便利そうなので書き残しておきます。
http://blogs.msdn.com/powershell/archive/2009/04/06/checking-for-bound-parameters.aspx
パラメターがどのように引き渡されたかを関数などの内部で確認できます。
出力はこうなります。
そこにパラメター名のキーがあるかどうかで判別可能です。
従来だと param ($x = $null) のようにたとえば$nullをデフォルト値としておき、
$x が $null かどうかで判別したりしていました。
しかしこの方法だとデフォルト値はパラメターの正当な値の範囲に含められません。
つまり $null が渡されたのか x が渡されなかったのかが見分けられないのです。
$PSBoundParameters をつかった方法だとこのような問題はありません。
そういえば、次のように
でもこれは面白いけどちょっと使いにくいかな、と思います。
Version 2 から追加された $PSBoundParameters の使い方を知りました。
便利そうなので書き残しておきます。
http://blogs.msdn.com/powershell/archive/2009/04/06/checking-for-bound-parameters.aspx
パラメターがどのように引き渡されたかを関数などの内部で確認できます。
function fooのように使えます。
{
param($x, $y)
if (-not $PSBoundParameters.ContainsKey('x'))
{
Write-host 'x not Bound!'
}
Write-Host "x is ($x)"
Write-Host $PSBoundParameters
}
foo -y 2 $null
出力はこうなります。
x is ()$PSBoundParameters はパラメターを含んだハッシュテーブルになっているので、
[y, 2] [x, ]
そこにパラメター名のキーがあるかどうかで判別可能です。
従来だと param ($x = $null) のようにたとえば$nullをデフォルト値としておき、
$x が $null かどうかで判別したりしていました。
しかしこの方法だとデフォルト値はパラメターの正当な値の範囲に含められません。
つまり $null が渡されたのか x が渡されなかったのかが見分けられないのです。
$PSBoundParameters をつかった方法だとこのような問題はありません。
そういえば、次のように
function booデフォルト値として Throw を含む文を書くという方法を見かけたこともあります。
{
param($x = $(Throw "x required"))
Write-Host "x is ($x)"
}
でもこれは面白いけどちょっと使いにくいかな、と思います。