我试图了解.GetNewClosure()如何在PowerShell 2中的脚本cmdlet上下文中工作。
本质上,我有一个返回像这样的对象的函数:
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()
..
}
Run Code Online (Sandbox Code Playgroud)
如果我没有验证集选项,那么关闭似乎可以正常工作。如果包含它,则新的关闭失败并显示以下错误。
“使用” 0“参数调用” GetNewClosure“的异常:”无法添加属性,因为这将导致带有值的变量Options变得无效。“
大概闭包正在尝试捕获对Cmdlet的调用的上下文。由于参数“ Options”根本没有绑定,因此在参数验证中效果不佳。
我想可以通过将验证作为代码放置在Cmdlet的正文中而不是使用[Validate *()]装饰器来避免这种情况,但这似乎很讨厌并且晦涩难懂。有没有办法融合这两个想法?