【问题标题】:How to create a wrapper for an advanced function cmdlet that uses dynamic parameters如何为使用动态参数的高级函数 cmdlet 创建包装器
【发布时间】:2021-01-08 11:07:32
【问题描述】:

我正在尝试为 Pester 的 Should cmdlet 创建一个包装器(代理)。可能的用例包括transparent logging of test input even in case of successimprove the way Pester logs objects of certain types, e. g. hashtable

由于Should 是一个高级功能,因此通过$args splatting 转发参数不起作用。

所以我尝试使用System.Management.Automation.ProxyCommand::Create() 生成包装器,如this answer 所述:

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

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

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

看起来包装器生成器不理解dynamicparam declaration of Should

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

【问题讨论】:

    标签: powershell wrapper pester


    【解决方案1】:

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

    默认情况下包装器生成器省略 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
    

    【讨论】:

    • 有一个错字,应该是param ( ... )。修复该问题后,当调用 0 | .\shouldWrapper.ps1 -Be 1 之类的包装器时,我收到以下错误消息:“应该:无法使用指定的命名参数解析参数集。发出的一个或多个参数不能一起使用或参数数量不足提供了。”
    • 奇数。你用的是什么版本的 Pester?它适用于 Windows PowerShell 5.1 中的 Pester 3.4 和 PowerShell 7.1 中的 Pester 5
    • 有一个overload of ProxyCommand.Create() 有一个布尔参数generateDynamicParameters,但似乎没有任何作用。可能是一个错误?
    • 这是我的印象,我从来没有让超负荷工作 - 因此上面的stichwork :-)
    • 做得很好。这确实是一个错误,值得注意的是它只影响(高级)函数和脚本,而不是编译的 cmdlet - 请参阅GitHub issue #4792;我在此处添加了一条评论以指出此处的解决方法。 /cc @zett42
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多