我试图了解 .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()
..
}
如果我没有验证集选项,则关闭似乎可以正常工作。但是,如果包含它,则新的闭包将失败并出现以下错误。
使用“0”参数调用“GetNewClosure”的异常:“无法添加属性,因为它会导致具有值的变量选项变得无效。”
据推测,闭包正试图捕获对 Cmdlet 的调用的上下文。由于参数“Options”根本没有绑定,这与参数验证不太好。
我想可以通过将验证作为代码放置在 Cmdlet 的主体中来避免这种情况,而不是使用 [Validate*()] 装饰器——但这看起来很讨厌而且很模糊。有没有办法融合这两个想法?