PowerShell: GetNewClosure () и командлеты с проверкой

Я пытаюсь понять, как .GetNewClosure () работает в контексте командлета сценария в PowerShell 2.

По сути, у меня есть функция, которая возвращает объект следующим образом:

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() 

..
}

Если у меня нет опций проверки набора, закрытие, кажется, работает нормально. Однако, если он включен, новое закрытие завершается неудачей со следующей ошибкой.

Исключение, вызывающее «GetNewClosure» с аргументом (ами) «0»: «Атрибут не может быть добавлен, поскольку это приведет к тому, что переменная Options со значением станет недействительной».

Предположительно закрытие пытается захватить контекст вызова к командлету. Поскольку параметр «Опции» вообще не связан, это не очень хорошо с проверкой параметров.

Я полагаю, что этого можно избежать, поместив проверку в виде кода в тело командлета вместо использования декораторов [Validate * ()] - но это кажется неприятным и довольно неясным. Есть ли способ объединить эти две идеи?

Ответы на вопрос(2)

Ваш ответ на вопрос