假设我有一个函数,其中依赖关系和某些参数如下:
:function Invoke-ACommandLaterOn
{
param
(
# ...
[string] $CommandName,
[object] $PipelineParams,
[object[]] $PositionalParams,
[hashtable]$NamedParams
# ...
)
Assert-ParameterBinding @PSBoundParameters
# ...
# Some complicated long-running call tree that eventually invokes
# something like
# $PipelineParams | & $CommandName @PositionalParams @NamedParams
# ...
}
我想立即断言该参数与$CommandName
的绑定成功。这就是Assert-ParameterBinding
的意图。但是,我不确定如何实现Assert-ParameterBinding
,但是。
当然,我可以尝试立即调用$CommandName
,但是在这种情况下这样做会有副作用,直到首先完成了其他一堆其他长期事物。
我如何断言参数绑定到函数将成功而不调用函数?
如果您做了这样的事情(Assert-
函数内部):
$cmd = Get-Command $CommandName
$meta = [System.Management.Automation.CommandMetadata]::new($cmd)
$proxy = [System.Management.Automation.ProxyCommand]::Create($meta)
$code = $proxy -ireplace '(?sm)(?:begin|process|end)s*{.*','begin{}process{}end{}'
$sb = [scriptblock]::Create($code)
$PipeLineParams | & $sb @PositionalParams @NamedParams
实际上,我不确定它是否可以与位置参数一起使用或与两个不同的套装一起使用,在我的头顶上(我没有进行太多测试)。
说明
我有一些想法。首先,参数结合可能非常复杂。在管道调用的情况下,随着击中不同的块,绑定发生不同。
因此,让Powershell可以通过重新创建相同的功能,但没有任何作用的身体来解决这个问题。
所以我使用内置的方式来生成代理功能,因为它照顾了所有这些凌乱的工作,然后残酷地替换了身体,因此它实际上没有调用原件。
理想情况下,您将打个电话,遵循所有常规参数绑定过程,但最终什么都没有完成。
将其包裹在try
/catch
或其他错误测试中应该是一个很好的测试。
这个甚至处理动态参数。
可能在某些边缘案例中行不通,但我认为它们会很少。
此外,ValidateScript
属性和动态参数可能会产生副作用。