gpt4 book ai didi

powershell - 如何强制指定一组中的至少一个参数?

转载 作者:行者123 更新时间:2023-12-02 23:43:21 24 4
gpt4 key购买 nike

我有一个 PowerShell 函数,它接受一个字符串和三个开关。所以调用将是这样的:

My-Function "some string" -Switch1 -Switch2 -Switch3

但是,我想让这个函数仅在提供字符串和至少一个开关时运行。所以:

My-Function "some string" -Switch1 -Switch3  # Valid
My-Function "some string" -Switch2 # Valid
My-Function "some string" # Invalid

我知道我可以通过使用 $MyInvocation 对象检查是否已传递开关来做到这一点,但是有没有办法使用 ParameterParameterSet 属性?

简而言之,这就是我要做的:

  • 每次调用函数时都必须提供该字符串。
  • 每次调用该函数时必须至少提供一个开关。

最佳答案

我不认为你可以用参数集和强制参数来做到这一点。如果您使用交替强制参数定义了 3 个不同的参数集,如下所示:

Param(
[Parameter(Mandatory=$true)]
[string]$Text,

[Parameter(Mandatory=$true, ParameterSetName='o1')]
[Parameter(Mandatory=$false, ParameterSetName='o2')]
[Parameter(Mandatory=$false, ParameterSetName='o3')]
[Switch][bool]$Switch1,

[Parameter(Mandatory=$false, ParameterSetName='o1')]
[Parameter(Mandatory=$true, ParameterSetName='o2')]
[Parameter(Mandatory=$false, ParameterSetName='o3')]
[Switch][bool]$Switch2,

[Parameter(Mandatory=$false, ParameterSetName='o1')]
[Parameter(Mandatory=$false, ParameterSetName='o2')]
[Parameter(Mandatory=$true, ParameterSetName='o3')]
[Switch][bool]$Switch3
)

如果您只使用其中一个开关,它会起作用:

My-Function "foo" -Switch2

但如果你使用多个开关则失败:

PS C:\> .\test.ps1 "foo" -Switch1 -Switch2
C:\test.ps1 : Parameter set cannot be resolved using the specified named
parameters.
At line:1 char:1
+ .\test.ps1 "foo" -Switch1 -Switch2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [test.ps1], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,test.ps1

我会改用经过设置验证的强制参数:

Param(
[Parameter(Mandatory=$true)]
[string]$Text,

[Parameter(Mandatory=$true)]
[ValidateSet('Switch1', 'Switch2', 'Switch3', ignorecase=$true)]
[string[]]$Options
)

这将允许您像这样调用函数:

My-Function "foo" -Options Switch1
My-Function "foo" -Options Switch2,Switch3

或者您可以将所有三个开关设为可选并在函数内验证它们:

Param(
[Parameter(Mandatory=$true)]
[string]$Text,

[Parameter(Mandatory=$false)]
[Switch][bool]$Switch1,

[Parameter(Mandatory=$false)]
[Switch][bool]$Switch2,

[Parameter(Mandatory=$false)]
[Switch][bool]$Switch3
)

if (-not ($Switch1.IsPresent -or $Switch2.IsPresent -or $Switch3.IsPresent)) {
throw 'Missing switch'
}

Dynamic parameters可能是另一种选择,但我不能肯定地说。

关于powershell - 如何强制指定一组中的至少一个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34000602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com