具有多个ParameterSetName的函数中的AmbiguousParameterSet

时间:2015-07-31 15:49:04

标签: powershell parameters powershell-v2.0

我正在编写一个函数来根据条件选择给定路径下的文件。

这些是我的输入参数:

  • $ Path:必填,字符串
  • $ OwnedBy:可选,字符串
  • $ NotOwnedBy:optional,string
  • $ BiggerThan:optional,int
  • $ SmallerThan:optional,int

我想让我的函数接受多个filter-parameters但避免那些冲突,以便函数拒绝$ OwnedBy和$ NotOwnedBy,或者$ BiggerThan和$ SmallerThan。可能的组合应该是:

  1. My-Function -Path [string]
  2. My-Function -Path [string] -OwnedBy [string]
  3. My-Function -Path [string] -NotOwnedBy [string]
  4. My-Function -Path [string] -BiggerThan [int]
  5. My-Function -Path [string] -SmallerThan [int]
  6. My-Function -Path [string] -OwnedBy [string] -BiggerThan [int]
  7. My-Function -Path [string] -OwnedBy [string] -SmallerThan [int]
  8. My-Function -Path [string] -NotOwnedBy [string] -BiggerThan [int]
  9. My-Function -Path [string] -NotOwnedBy [string] -SmallerThan [int]
  10. 我正在为上述每个组合

    使用ParameterNameSet
    items[]

    但只有在第1点进行调用时才有效。 所有其他方式都给我一个这样的错误:

    [CmdletBinding(DefaultParametersetName="Set1")]
    Param(
        [Parameter(Position=0,Mandatory=$true)]
        [String] $Path,
    
        [Parameter(ParameterSetName="Set2")]
        [Parameter(ParameterSetName="Set6")]
        [Parameter(ParameterSetName="Set7")]
        [String] $OwnedBy,
    
        [Parameter(ParameterSetName="Set3")]
        [Parameter(ParameterSetName="Set8")]
        [Parameter(ParameterSetName="Set9")]
        [String] $NotOwnedBy,
    
        [Parameter(ParameterSetName="Set4")]
        [Parameter(ParameterSetName="Set6")]
        [Parameter(ParameterSetName="Set8")]
        [String] $BiggerThan,
    
        [Parameter(ParameterSetName="Set5")]
        [Parameter(ParameterSetName="Set7")]
        [Parameter(ParameterSetName="Set9")]
        [String] $SmallerThan
    )
    

1 个答案:

答案 0 :(得分:0)

正如安斯加所说,你有重叠的子集。修复它而不重新考虑策略的最简单方法是保留当前参数集并强制所有参数(这需要3.0 +版本):

function Test {
[CmdletBinding(DefaultParametersetName="Set1")]
Param(
    [Parameter(Position=0,Mandatory=$true)]
    [String] $Path,

    [Parameter(ParameterSetName="Set2",Mandatory=$true)]
    [Parameter(ParameterSetName="Set6",Mandatory=$true)]
    [Parameter(ParameterSetName="Set7",Mandatory=$true)]
    [String] $OwnedBy,

    [Parameter(ParameterSetName="Set3",Mandatory=$true)]
    [Parameter(ParameterSetName="Set8",Mandatory=$true)]
    [Parameter(ParameterSetName="Set9",Mandatory=$true)]
    [String] $NotOwnedBy,

    [Parameter(ParameterSetName="Set4",Mandatory=$true)]
    [Parameter(ParameterSetName="Set6",Mandatory=$true)]
    [Parameter(ParameterSetName="Set8",Mandatory=$true)]
    [String] $BiggerThan,

    [Parameter(ParameterSetName="Set5",Mandatory=$true)]
    [Parameter(ParameterSetName="Set7",Mandatory=$true)]
    [Parameter(ParameterSetName="Set9",Mandatory=$true)]
    [String] $SmallerThan
)

}

您基本上通过严格定义集合来实现可选性。