如何为使用动态参数的高级函数 cmdlet 创建包装器

zet*_*t42 4 powershell wrapper pester

我正在尝试为 Pester 的 cmdlet 创建一个包装器(代理)Should。可能的用例包括即使在成功的情况下也可以透明地记录测试输入,并改进 Pester 记录某些类型对象的方式,例如hashtable.

作为Should一个高级函数,通过$argssplatting 转发参数不起作用。

所以我尝试使用生成一个包装器,如这个答案System.Management.Automation.ProxyCommand::Create()所述:

$cmd = Get-Command Should
$wrapperSource = [System.Management.Automation.ProxyCommand]::Create( $cmd )
$wrapperSource >should_wrapper.ps1
Run Code Online (Sandbox Code Playgroud)

调用包装器时,Powershell 输出以下错误消息:

应该:无法使用指定的命名参数解析参数集。发出的一个或多个参数不能一起使用或提供的参数数量不足。

看起来包装器生成器不理解 的动态参数声明Should

如何在Should不重复 Pester 代码的情况下为 Pester 编写通用包装器?

Mat*_*sen 5

看起来包装器生成器不理解 Should 的动态参数声明。

包装器生成器默认省略。 dynamicparam幸运的是,这个问题可以通过一些模板轻松解决:

$cmd = Get-Command Should
$pct = [System.Management.Automation.ProxyCommand]
$wrapperSource = @(
  $pct::GetCmdletBindingAttribute($cmd)
  'param('
    $pct::GetParamBlock($cmd)
  ')'
  'dynamicparam {'
    $pct::GetDynamicParam($cmd)
  '}'
  'begin {'
    $pct::GetBegin($cmd)
  '}'
  'process {'
    $pct::GetProcess($cmd)
  '}'
  'end {'
    $pct::GetEnd($cmd)
  '}'
) -join [Environment]::NewLine
Run Code Online (Sandbox Code Playgroud)

  • 有一个[`ProxyCommand.Create()`的重载](https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.proxycommand.create?view=powershellsdk-7.0.0 #System_Management_Automation_ProxyCommand_Create_System_Management_Automation_CommandMetadata_System_String_System_Boolean_) 具有布尔参数 `generateDynamicParameters`,但似乎没有任何效果。可能是一个错误? (2认同)
  • 做得很好。这确实是一个错误,值得注意的是,它只影响(高级)_函数和脚本_,而不影响编译的 cmdlet - 请参阅 [GitHub 问题 #4792](https://github.com/PowerShell/PowerShell/issues/4792);我在那里添加了一条评论来指出此处的解决方法。/抄送@zett42 (2认同)