Наборы параметров Powershell и дополнительные параметры

Я пишу функцию, для которой два параметра должны быть исключительными и необязательными.

Вот допустимые входные данные:

new-event -Title sometitle -Text sometext -TimestampHappened 1234567 -SomeOtherOptionalParam somestring

new-event -Title sometitle -Text sometext -DateHappened (get-date) -SomeOtherOptionalParam somestring

new-event -Title sometitle -Text sometext -SomeOtherOptionalParam somestring

new-event -Title sometitle -Text sometext

Вот недопустимый ввод:

new-event -Title sometitle -Text sometext -DateHappened (get-date) -TimestampHappened 1234567 -SomeOtherOptionalParam somestring

Вот мой код:

[CmdletBinding()]

# Most parameters belong to Default, New-Event:ByDate and New-Event:ByTimestamp parameter sets
param (
     [Parameter(
        Position=0,
        Mandatory=$True,
        ParameterSetName="Default"
    )]
    [Parameter(
        Position=0,
        Mandatory=$True,
        ParameterSetName="New-Event:ByDate"
    )]
    [Parameter(
        Position=0,
        Mandatory=$True,
        ParameterSetName="New-Event:ByTimestamp"
    )]
    [ValidateNotNullOrEmpty()]
    [String]$Title,

[Parameter(
        Position=1,
        Mandatory=$True,
        ParameterSetName="Default"
    )]
    [Parameter(
        Position=1,
        Mandatory=$True,
        ParameterSetName="New-Event:ByDate"
    )]
    [Parameter(
        Position=1,
        Mandatory=$True,
        ParameterSetName="New-Event:ByTimestamp"
    )]
    [ValidateNotNullOrEmpty()]
    [String]$Text,

 [Parameter(
        Position=2,
        Mandatory=$False,
        ParameterSetName="New-Event:ByDate"
    )]
    [ValidateNotNullOrEmpty()]
    [datetime]$DateHappened,

[Parameter(
    Position=2,
    Mandatory=$False,
    ParameterSetName="New-Event:ByTimestamp"
    )]
    [ValidateNotNullOrEmpty()]
    [Double]$TimestampHappened,


   [Parameter(
        Position=3,
        Mandatory=$False,
        ParameterSetName="Default"
    )]
   [Parameter(
        Position=3,
        Mandatory=$False,
        ParameterSetName="New-Event:ByDate"
    )]
    [Parameter(
        Position=3,
        Mandatory=$False,
        ParameterSetName="New-Event:ByTimestamp"
    )]
    [String]$SomeOtherParam,
    ...

Вот что я получаю, когда звоню Get-Help:

PS> get-help New-Event

NAME
    New-Event

SYNOPSIS
    Post an event to the stream.


SYNTAX
    New-Event [-Title] <String> [-Text] <String> [[-TimestampHappened] <Double>] [[-Priority] <String>] [[-Hostname] <String>] [[-Tags] <String[]>] [[-AlertType] <String>] [<CommonParameters>]

    New-Event [-Title] <String> [-Text] <String> [[-DateHappened] <DateTime>] [[-Priority] <String>] [[-Hostname] <String>] [[-Tags] <String[]>] [[-AlertType] <String>]  <String>] [<CommonParameters>]

    New-Event [-Title] <String> [-Text] <String> [[-Priority] <String>] [[-Hostname] <String>] [[-Tags] <String[]>] [[-AlertType] <String>] [<CommonParameters>]

Однако вот ошибка, которую я получаю, когда пытаюсь вызвать функцию только с двумя обязательными параметрами:

New-Event -Title test -Text text
New-Event : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ New-Event -Title test -Text text
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-Event], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,New-Event

Я что-то упускаю, но не могу понять, что ...

Как я могу получить два взаимоисключающих и необязательных параметра?


person simsaull    schedule 11.02.2017    source источник


Ответы (1)


В этом есть смысл. У вас есть 3 набора параметров, и 2 обязательных параметра включены в каждый набор. Как PowerShell мог определить, какой набор вы собираетесь использовать?

К счастью, атрибут [CmdletBinding()] может принимать параметр, который помогает в этом конкретном случае: DefaultParameterSetName. Установка этого параметра позволяет PowerShell использовать этот набор в случае (определенных) двусмысленностей. Используйте это так:

[CmdletBinding(DefaultParameterSetName='Default')]

Обратите внимание, что в этом случае вы назвали его по умолчанию; его можно было назвать как угодно.

person briantist    schedule 11.02.2017
comment
Ах, это действительно имеет смысл. Я был зациклен на двух параметрах даты, когда проблема была в другом месте. Спасибо! - person simsaull; 11.02.2017