环境注意事项:我当前针对的是PowerShell 5.1,因为6有不相关的限制,我尚无法解决。

在我正在编写的Powershell模块中,有一个主要功能是一堆较小的功能的组合。主函数具有较小函数参数的超集。这个想法是,调用main函数将使用在main上指定的必要参数来调用每个较小的函数。因此,例如:

function Main { [CmdletBinding()] param($A,$B,$C,$D)
    Sub1 -A $A -B $B
    Sub2 -C $C -D $D
}

function Sub1 { [CmdletBinding()] param($A,$B)
    "$A $B"
}

function Sub2 { [CmdletBinding()] param($C,$D)
    "$C $D"
}

明确指定子功能参数既繁琐又容易出错,尤其是对于[switch]参数。所以我想使用splatting使事情变得更容易。无需在子功能上指定每个参数,而是将父代的$PSBoundParameters撒到每个子功能上,如下所示:
function Main { [CmdletBinding()] param($A,$B,$C,$D)
    Sub1 @PSBoundParameters
    Sub2 @PSBoundParameters
}

这样做的直接问题是,子功能然后针对未定义的任何参数开始引发错误,例如“Sub1 : A parameter cannot be found that matches parameter name 'C'.”。如果删除了[CmdletBinding()]声明,则一切正常,但我失去了这些子功能的所有好处正在advanced functions

所以我当前的解决方法是在每个使用 ValueFromRemainingArguments 参数属性的子功能上添加和附加参数,如下所示:
function Sub1 { [CmdletBinding()]
    param($A,$B,[Parameter(ValueFromRemainingArguments)]$Extra)
    "$A $B"
}

function Sub2 { [CmdletBinding()]
    param($C,$D,[Parameter(ValueFromRemainingArguments)]$Extra)
    "$C $D"
}

从技术上讲,这已经足够好了。子功能将获得其特定的参数,而其他功能将被忽略。如果我只是为我而写,那我会继续生活并完成它。

但是对于供公众使用的模块,存在一个令人讨厌的因素,即-Extra参数在那里。首先,它显示在Get-Help输出中,这意味着即使不得不说“忽略此内容”,我也必须对其进行记录。

我是否可以采取额外的步骤使该额外参数对最终用户有效地不可见?还是我要解决所有这些错误,并且有更好的方法在高级功能上允许额外的参数?

最佳答案

我通常的方法是仅导出在模块中调用内部(即非面向用户)功能的“包装器”功能。

关于powershell - 在Powershell高级功能上允许其他参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49579468/

10-13 07:46
查看更多