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

时间:2018-03-30 18:23:33

标签: powershell

环境说明:我目前正在针对PowerShell 5.1,因为6还有无法解决的限制我无法解决。

在我写的Powershell模块中,有一个主要功能,它是一堆较小功能的集合体。 main函数具有较小函数参数的超集。这个想法是调用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输出中,这意味着我必须记录它,即使只是说“忽略它。”

我可以采取额外的步骤,使最终用户有效地看不到额外的参数吗?或者我是否认为这是错误的,并且有更好的方法可以在高级函数上添加额外的参数?

1 个答案:

答案 0 :(得分:1)

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