powershellparameter-sets

Passing ParameterSet values to other ParameterSet causes AmbiguousParameterSet exception


I am trying to call a PowerShell function that has a parameter set, using another PowerShell function with a parameter set. In the code below, I want to call Entry-Point using either the -ABC or -DEF switch, not both. However, when I run Entry-Point with any number of parameters, I get the AmbiguousParameterSet exception below.

function My-Function {
    [CmdletBinding(DefaultParameterSetName='ABC')]
    Param(
        [Parameter(Mandatory=$false, ParameterSetName='ABC', Position=1)]
        [switch] $ABC,

        [Parameter(Mandatory=$false, ParameterSetName='DEF', Position=1)]
        [switch] $DEF,

        [switch] $Extra
    )

    echo $ABC
    echo $DEF
    echo $Extra
}


function Entry-Point {
    [CmdletBinding(DefaultParameterSetName='ABC')]
    Param(
        [Parameter(Mandatory=$false, ParameterSetName='ABC', Position=1)]
        [switch] $ABC,

        [Parameter(Mandatory=$false, ParameterSetName='DEF', Position=1)]
        [switch] $DEF,

        [switch] $Extra
    )

    My-Function -ABC:$ABC -DEF:$DEF -Extra:$Extra
}
My-Function : Parameter set cannot be resolved using the specified named
parameters.
At line:24 char:1
+ My-Function -ABC:$ABC -DEF:$DEF -Extra:$Extra
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [My-Function], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,My-Function

How can I pass the parameters -ABC and -DEF -- whether each was specified or not -- from function Entry-Point to function My-Function?


Solution

  • The quick answer is splatting. PowerShell lets you present a hashtable as the parameters to a function (using @ instead of $), and uses the keys of the hashtable as parameter names, the values are the parameter values.

    Also, each advanced function automatically sets $PSBoundParameters as a hashtable of the parameters that are passed in.

    So...you can just say: My-Function @PSBoundParameters