我有一个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
对象传递了开关来做到这一点,但是有没有一种方法可以使用Parameter
和ParameterSet
属性呢?
简而言之,这就是我想要做的:
我认为您无法使用参数集和必需参数来执行此操作。如果您定义了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
我会改用set-validated强制性参数:
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'
}
动态参数可能是另一种选择,但是我不能肯定地说。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句