允许Powershell高级功能上的额外参数

允许Powershell高级功能上的额外参数,powershell,Powershell,环境提示:我目前的目标是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 } funct

环境提示:我目前的目标是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]
参数时。所以我想用它来让事情变得更简单。我不会在子函数上指定每个参数,而是将父函数中的
$PSBoundParameters
按如下方式显示在每个子函数上:

function Main { [CmdletBinding()] param($A,$B,$C,$D)
    Sub1 @PSBoundParameters
    Sub2 @PSBoundParameters
}
function Sub1 { [CmdletBinding()] 
    param($A,$B,[Parameter(ValueFromRemainingArguments)]$Extra)
    "$A $B"
}

function Sub2 { [CmdletBinding()]
    param($C,$D,[Parameter(ValueFromRemainingArguments)]$Extra)
    "$C $D"
}
执行此操作的直接问题是,如果删除
[CmdletBinding()]
声明,则子函数会开始为其未定义的任何参数抛出错误,例如,“
Sub1:找不到与参数名称“C”匹配的参数。”,一切正常,但我失去了潜艇的所有好处

因此,我当前的解决方法是在每个使用参数属性的子函数上添加和附加参数,如下所示:

function Main { [CmdletBinding()] param($A,$B,$C,$D)
    Sub1 @PSBoundParameters
    Sub2 @PSBoundParameters
}
function Sub1 { [CmdletBinding()] 
    param($A,$B,[Parameter(ValueFromRemainingArguments)]$Extra)
    "$A $B"
}

function Sub2 { [CmdletBinding()]
    param($C,$D,[Parameter(ValueFromRemainingArguments)]$Extra)
    "$C $D"
}
从技术上讲,这已经足够有效了。子函数得到它们的特定参数,而多余的被忽略。如果我写这篇文章只是为了我自己,我会继续我的生活,结束它

但是对于一个供公众使用的模块来说,有一个额外的参数存在的烦恼因素。它主要出现在
Get Help
output中,这意味着我必须记录它,即使只是说“忽略它”


我是否可以采取额外的措施,让终端用户有效地看不到这个额外的参数?或者我的做法完全错了,有更好的方法允许在高级函数上使用额外的参数吗?

我通常的方法是只导出调用模块中内部(即,不面向用户)函数的“包装器”函数。

我必须记录它,即使只是说“忽略它”你最好记录这一点,它不应该是“忽略这一点”,而是类似这样的:“由于这种黑客行为,任何拼写错误的参数都将被默默忽略,而不是提供相关的错误消息。”我通常的方法是只导出调用内部(即,不面向用户)的“包装器”函数模块中的函数。@Bill_Stewart这…实际上不是个坏主意。因此,公共sub将省略$Extra参数,直接将所有内容传递给私有sub。main仍然可以使用大splat调用私有sub。它增加了一点混乱,但摆脱了我的主要抱怨。我觉得这根本不是一个混乱,而是一个合理的模块化方法。(我想,每个人都有自己的想法。)抱歉,kludge这个词选得不好。我的意思是技术上需要维护更多的代码。