2017-02-11 3 views
3

Я пишу функцию, для которой 2 параметра должны быть эксклюзивными и необязательно.Наборы параметров 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>] 

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

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 

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

Благодарим за помощь.

+1

'[CmdletBinding (DefaultParameterSetName = 'Default')]' – PetSerAl

ответ

3

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

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

[CmdletBinding(DefaultParameterSetName='Default')] 

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

+0

А, это действительно имеет смысл. Я был одержим более двух параметров даты, когда проблема была в другом месте. Благодаря! – simsaull

Смежные вопросы