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')] 

注それは、defaultという名前、このケースであること。それは何かに命名された可能性があります。

+0

ああ、確かに意味があります。私は問題が他の場所にあったときに2つの日付のパラメータに執着していました。ありがとう! – simsaull

関連する問題