How to create a wrapper for an advanced function cmdlet that uses dynamic parameters

ぃ、小莉子 提交于 2021-01-16 04:14:08

问题


I'm trying to create a wrapper (proxy) for Pester's Should cmdlet. Possible use cases include transparent logging of test input even in case of success and improve the way Pester logs objects of certain types, e. g. hashtable.

As Should is an advanced function, forwarding arguments via $args splatting does not work.

So I tried to generate a wrapper using System.Management.Automation.ProxyCommand::Create(), as described by this answer:

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

When calling the wrapper, Powershell outputs this error message:

Should: Parameter set cannot be resolved using the specified named parameters. One or more parameters issued cannot be used together or an insufficient number of parameters were provided.

It looks like the wrapper generator doesn't understand the dynamicparam declaration of Should.

How to write a generic wrapper for Pester's Should without duplicating Pester code?


回答1:


It looks like the wrapper generator doesn't understand the dynamicparam declaration of Should.

The wrapper generator omits dynamicparam by default. Fortunately, this is easily fixed with a bit of templating:

$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


来源:https://stackoverflow.com/questions/65627872/how-to-create-a-wrapper-for-an-advanced-function-cmdlet-that-uses-dynamic-parame

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!