我想在可定义一些开关的自定义Powershell模块中编写一个函数。
该函数应完全不带开关或带一个开关调用。不允许多个开关。
例如:
Get-Foo -Value "text" # Should return "text"
Get-Foo -Value "2019-01-01T00:00:00Z" -AsDate # Should return the value as date
Get-Foo -Value "42" -AsInteger # Should return 42 as integer
Get-Foo -Value "xxx" -AsDate -AsInteger # Should fail
为了支持这些情况,我在玩参数集:
function Get-Foo{
param(
[Parameter(Mandatory=$true)]
[string]$Value,
[Parameter(ParameterSetName='AsDate')]
[Switch]$AsDate,
[Parameter(ParameterSetName='AsInteger')]
[Switch]$AsInteger
)
switch ($PsCmdlet.ParameterSetName) {
"AsDate" {
[datetime]::Parse($Value)
}
"AsInteger" {
[int]::Parse($Value)
}
"__AllParameterSets" {
$Value
}
}
}
但是,这无法正常工作。通过两个开关之一可以工作。通过两个开关失败(但这是有意的)。
不分配任何开关失败,因为它无法解析参数集。
该如何解决?
答案 0 :(得分:2)
如果为函数提供一个DefaultParameterSetName
,并将最后一个开关测试更改为Default
,则一切正常:
function Get-Foo {
[CmdletBinding(DefaultParameterSetName = 'None')]
param(
[Parameter(Mandatory=$true)]
[string]$Value,
[Parameter(ParameterSetName='AsDate')]
[Switch]$AsDate,
[Parameter(ParameterSetName='AsInteger')]
[Switch]$AsInteger
)
switch ($PsCmdlet.ParameterSetName) {
"AsDate" {
[datetime]::Parse($Value)
}
"AsInteger" {
[int]::Parse($Value)
}
default {
$Value
}
}
}
结果:
Get-Foo -Value "text" # Returns "text" Get-Foo -Value "2019-01-01T00:00:00Z" -AsDate # Returns the value as date (if Parse() is possible) Get-Foo -Value "42" -AsInteger # Returns 42 as integer (if Parse() is possible) Get-Foo -Value "xxx" -AsDate -AsInteger # Fails
注意:对于更复杂的Switch()比较,请考虑break
语句以在匹配后停止比较开关。参见about_Switch