PowerShellでDynamicParamを使ってValidateSetを動的に設定しよー

関数のパラメータで受ける値を幾つかの候補で固定したい場合にValidateSetを使うけど、それが環境や実行状況で値が変動するような感じにしたい!
そんなときはDynamicParam

例えばだ
こないだ書いたのでシリアルポートの名前を受ける関数があるんだが、[System.IO.Ports.SerialPort]::GetPortNames()で得られる名前を渡すわけだし、だったらValidateSetがそれだったら簡単でいいじょん!というお話である

DynamicParamfunction内にDynamicParam節を書いて、その中でSystem.Management.Automation.RuntimeDefinedParameterDictionaryreturnしてやるとパラメータが追加されるという仕組み
New-DynamicParameterCollectionがそれを返す
パラメータはNew-DynamicParameterで作る
Add-ValidateSetでそのパラメータにValidateSetを設定する

じゃあ使ってみようか

function Hoge {
    [CmdletBinding()]
    param()
    dynamicParam {
        $dparam = New-DynamicParameter 'Fuga' -Mandatory -Position 0 | Add-ValidateSet $(
            [Enum]::GetValues([DayOfWeek])
        )
        return New-DynamicParameterCollection $dparam
    }
    begin {
        $Fuga = $PSBoundParameters.Fuga
    }
    process {
        return $Fuga
    }
}

help Hogeすると

構文
    Hoge [-Fuga]  {Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday}  [<CommonParameters>]

ValidateSetが反映されてることがわかる

PS> help Hoge -Parameter fuga

-Fuga 

    必須                         true
    位置                         0
    パイプライン入力を許可する   false
    パラメーター セット名           (すべて)
    エイリアス                      なし
    動的                     true

詳細を見ると動的がtrueになってますね

最後に、DynamicParamを使う関数を書くときにハマったことを

  • パラメータを受けるのでparam()は必須、空でも書いておく
  • CmdletBindingも必須、ないとパラメータが追加されない
  • 処理はbegin節、process節、end節に書く、Pipelineを使ってなくても、だ
  • 受けた値は$PSBoundParametersから取得出来るっぽいのでそうしてみた

わりとめんどくせっ!

今回はValidateSetしかやってないけどDynamicParamはもっとなんか色々デキる子だと思う
気が向いたらもっと調べてみるね

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中