Я хочу написать функцию в пользовательском модуле 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
}
}
}
Однако это не работает должным образом. Прохождение одного из двух переключателей работает. Прохождение двух переключателей не удается (но это задумано).
Отсутствие переключателя вообще не работает, потому что он не может разрешить набор параметров.
Как это исправить?
@RohinSidharth, не совсем. Ответ, который вы предлагаете, указывает только, как использовать наборы параметров, а не как решить случай «без переключателя». В любом случае спасибо
Если вы дадите функции 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
Note: for more complex Switch() comparisons, consider the break
statement to stop the switch from comparing after a match. See about_Switch
Это именно то, что мне нужно! Спасибо
Это похоже на ответ: stackoverflow.com/questions/1767219/…