我认为你不能用参数集和强制参数来做到这一点。如果你用这样的交替强制参数定义了 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 可能是另一种选择,但我不能肯定地说。