Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何为使用动态参数的高级函数cmdlet创建包装器_Powershell_Wrapper_Pester - Fatal编程技术网

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

Powershell 如何为使用动态参数的高级函数cmdlet创建包装器,powershell,wrapper,pester,Powershell,Wrapper,Pester,我正在尝试为Pester的cmdlet创建包装(代理)。可能的用例包括和 由于Should是一个高级函数,因此通过$argssplatting转发参数不起作用 因此,我尝试使用System.Management.Automation.ProxyCommand::Create()生成包装,如下所述: 调用包装器时,Powershell会输出以下错误消息: 应:无法使用指定的名称解析参数集 参数。发出的一个或多个参数不能一起使用,或 提供的参数数量不足 看起来包装器生成器不理解 如何在不复制Pest

我正在尝试为Pester的cmdlet创建包装(代理)。可能的用例包括和

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

因此,我尝试使用
System.Management.Automation.ProxyCommand::Create()
生成包装,如下所述:

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

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

看起来包装器生成器不理解

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

看起来包装器生成器不理解Should的dynamicparam声明

默认情况下,包装生成器会忽略
dynamicRAM
。幸运的是,这可以通过一些模板轻松解决:

$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 |)时,我会收到以下错误消息:“应:无法使用指定的命名参数解析参数集。无法同时使用发出的一个或多个参数,或者提供的参数数量不足。”奇数。你用的是什么版本的纠缠?它适用于Windows PowerShell 5.1中的Pester 3.4和PowerShell 7.1中的Pester 5。这是一个具有布尔参数的生成动态参数,但似乎没有任何效果。可能是一个错误?这是我的印象,我从来没有让超负荷工作-因此上面的粘贴:-)做得很好。这确实是一个bug,值得注意的是,它只影响(高级)函数和脚本,而不影响已编译的cmdlet-请参阅;我在这里添加了一条评论,指出这里的解决方法/cc@zett42
$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