PowerShell参数集和可选参数

5

我正在编写一个函数,其中两个参数应该是互斥的并且是可选的。

下面是有效的输入:

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

我感觉我漏了什么,但是我想不出来是什么...

如何获取两个参数,它们是相互排斥的且可选的?


1
[CmdletBinding(DefaultParameterSetName='Default')] - user4003407
1个回答

6
这很有道理。你有3个参数集,而且每个集合中都包含了2个必填参数。PowerShell如何确定你要使用哪个集合呢?
幸运的是,[CmdletBinding()] 属性可以接受一个参数来解决这个问题: DefaultParameterSetName。设置它允许PowerShell在某些歧义的情况下使用此集合。使用方式如下:
[CmdletBinding(DefaultParameterSetName='Default')]

请注意,在这种情况下,将其命名为“default”,实际上可以使用任何名称。

啊,确实有道理。我一直在纠结于两个日期参数,而问题其实出在其他地方。谢谢! - simsaull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接