4

PowerShell 2 のスクリプト コマンドレットのコンテキスト内で .GetNewClosure() がどのように機能するかを理解しようとしています。

本質的に、次のようなオブジェクトを返す関数があります。

function Get-AnObject {
param(
    [CmdletBinding()]
    [Parameter(....)]
    [String[]]$Id
    ..
    [ValidateSet('Option1','Option2')]
    [String[]]$Options
)

...

    $T = New-Object PSCustomObject -Property @{ ..... } 
    $T | Add-Member -MemberType ScriptProperty -Name ExpensiveScriptProperty -Value {
        $this | Get-ExpensiveStuff
    }.GetNewClosure() 

..
}

検証セットオプションがない場合、クロージャーは正常に機能しているように見えます。ただし、含まれている場合、新しいクロージャーは次のエラーで失敗します。

"0" 個の引数を指定して "GetNewClosure" を呼び出し中に例外が発生しました: "属性を追加すると、値を持つ変数オプションが無効になる可能性があるため、属性を追加できません。"

おそらく、クロージャーは、コマンドレットへの呼び出しのコンテキストをキャプチャしようとしています。パラメータ「オプション」はまったくバインドされていないため、これはパラメータの検証とはうまくいきません。

[Validate*()] デコレータを使用する代わりに、コマンドレットの本体内にコードとして検証を配置することで、これを回避できると思いますが、これは厄介で非常にわかりにくいようです。この 2 つのアイデアを融合させる方法はありますか?

4

2 に答える 2