对于以下函数,它必须具有int类型的Group
参数或int数组类型的Items
参数。如何定义功能?它必须具有这些参数之一,但不能同时具有这两个参数。
Start-Execute -Group 1
Start-Execute -Items 100,200,300
答案 0 :(得分:6)
您想使用Parameter Sets,这是Advanced Functions的一项功能。
function Start-Execute {
[CmdletBinding()]
param(
[Parameter(
ParameterSetName='ByGroup',
Mandatory=$true
)]
[int]
$Group ,
[Parameter(
ParameterSetName='ByItems',
Mandatory=$true
)]
[int[]]
$Items
)
# function code
}
在函数内部,您可以通过测试$PSCmdlet.ParameterSetName
的值来确定指定了哪个参数集,以查看它匹配的参数集。
要查看您的参数集是否已正确创建,请在执行函数定义后运行以下命令:
Get-Help Start-Execute
这将显示每个参数集的单独调用。
话虽如此,我们无法分辨你的功能。如果$Items
只是一个包含多个$Group
的数组(也就是说,item
与group
相同),那么您的函数应该接受单个int数组[int[]]
然后总是用foreach
处理它,因为即使提供了一个值,它也能正常工作。
您询问了如何添加名为-Debug
的参数。我只想指出-Debug
是Common Parameter,因此您可能不应该使用该名称。我将使用名为-Test
的参数显示示例:
function Start-Execute {
[CmdletBinding()]
param(
[Parameter(
ParameterSetName='ByGroup',
Mandatory=$true
)]
[int]
$Group ,
[Parameter(
ParameterSetName='ByItems',
Mandatory=$true
)]
[int[]]
$Items ,
[Switch]
$Test
)
)
# function code
}
这是一种方法:不提供任何参数集名称。它将在所有套装中提供。
另一种方法是为每个参数集提供单独的[Parameter()]
属性:
[Parameter(
ParameterSetName='ByItems',
Mandatory=$true
)]
[Parameter(
ParameterSetName='ByGroup',
Mandatory=$false
)]
[Switch]
$Test
当您想对不同的集合使用不同的设置时,这非常有用,例如在一个参数集中强制使用此参数,在另一个参数集中强制使用此参数,或者使参数可用于多个但不是所有集合。