环境注意事项:我当前针对的是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/