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 * ()] - но это кажется неприятным и довольно неясным. Есть ли способ объединить эти две идеи?