在 PowerShell 中,我想编写一个函数,它接受不同的选项作为参数。没关系,如果它接收多个参数,但它必须接收至少一个参数。我想通过参数定义而不是之后的代码来强制执行它。我可以使用以下代码让它工作:
function Set-Option {
Param(
[Parameter(Mandatory, ParameterSetName="AtLeastOption1")]
[Parameter(Mandatory=$false, ParameterSetName="AtLeastOption2")]
[Parameter(Mandatory=$false, ParameterSetName="AtLeastOption3")]
$Option1,
[Parameter(Mandatory=$false, ParameterSetName="AtLeastOption1")]
[Parameter(Mandatory, ParameterSetName="AtLeastOption2")]
[Parameter(Mandatory=$false, ParameterSetName="AtLeastOption3")]
$Option2,
[Parameter(Mandatory=$false, ParameterSetName="AtLeastOption1")]
[Parameter(Mandatory=$false, ParameterSetName="AtLeastOption2")]
[Parameter(Mandatory, ParameterSetName="AtLeastOption3")]
$Option3
)
# Do stuff, but don't evaluate the plausibility of the given parameters here
}
但如您所见,它的扩展性很差。对于每个附加选项,我必须在所有其他选项中添加一行。能否以更高效和更易于维护的方式完成此操作?
正如我已经说过的,我不想检查代码中的参数,e。 G。通过评估 $PSBoundParameters
。出于自动文档的原因,我希望它发生在参数定义中。
如果您需要真实世界的示例,请查看 Set-DhcpServerv4OptionValue
它接受许多不同的选项(-DnsDomain
、-DnsServer
、-Router
、...),其中可以全部使用,但没有任何意义是没有意义的。
注意:在提供了多个答案之后,我才意识到我的代码实际上不起作用,如果您提供了不止一个选项的话。
最佳答案
以下不是一个很好的解决方案 - 根据您所说的 auto-doc 的含义,它可能不适合您 - 但它可以很好地扩展,因为您只需要 < em>一个附加参数集:
function Set-Option {
[CmdletBinding(DefaultParameterSetName='Fail')]
Param(
[Parameter(ParameterSetName='AtLeastOne')]
$Option1,
[Parameter(ParameterSetName='AtLeastOne')]
$Option2,
[Parameter(ParameterSetName='AtLeastOne')]
$Option3,
# Note: All that 'DontShow' does is to exclude the param. from tab completion.
[Parameter(ParameterSetName='Fail', DontShow)]
${-} = $(throw "Please specify at least one option.")
)
# Do stuff, but don't evaluate the plausibility of the given parameters here
}
所有真实参数都是可选并且属于不是默认值的相同参数集。
虚拟参数的用途
${-}
,这是默认参数集中唯一的一个,只是通过其默认值抛出错误。由于它的名字不规则,你实际上不能给它传递一个明确的值(这在这里是可取的,因为它纯粹是辅助而不是直接使用):你必须使用
-- <value>
,但是--
对参数绑定(bind)器有特殊意义(为后续参数停用命名参数绑定(bind))。不幸的是,属性(property)
DontShow
(例如[Parameter(DontShow)]
)仅隐藏tab-completion 中的参数,而不是语法图中的参数。- GitHub issue #7868建议引入一种从语法图中隐藏(过时的)参数的方法。
因此,不幸的是,虚拟参数集及其参数出现在语法图中,因此 Set-Option -?
显示如下:
SYNTAX
Set-Option [-- <Object>] [<CommonParameters>]
Set-Option [-Option1 <Object>] [-Option2 <Object>] [-Option3 <Object>] [<CommonParameters>]
请注意,语法图缺少您所需逻辑的符号。
关于powershell - 制作 PowerShell 所需的众多参数中的至少一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71574961/