SimonS
SimonS

Reputation: 1973

Parameter inside param() with multiple ParameterSetNames

I have the following param() block with a lot of ParameterSetNames

This is inside a function that I use to update, delete or create new rows in a SQL table.

but since I added the "Delete" and "New" ParameterSets, I can't use "DoWork" anymore. Why?

Error (unfortunately in German):

Set-User : Der Parametersatz kann mit den angegebenen benannten Parametern nicht aufgelöst werden. In Zeile:1 Zeichen:1 + set-user user value + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Set-user], ParameterBindingException + FullyQualifiedErrorId : AmbiguousParameterSet,Set-user

function Set-User {
    [CmdLetBinding(DefaultParameterSetName = "list")]
    param(
        [Parameter(ParameterSetName = "DoWork", Mandatory = $true, Position = 0)]
        [Parameter(ParameterSetName = "New", Mandatory = $true, Position = 0)]
        [Parameter(ParameterSetName = "Delete", Mandatory = $true, Position = 0)]
        [Alias("d")]
        [string]$domain,
        [Parameter(ParameterSetName = "DoWork", Mandatory = $true, Position = 1)]
        [Parameter(ParameterSetName = "New", Mandatory = $true, Position = 1)]
        [Alias("t")]
        [ValidateSet("XMLOrder","EdiOrder","EmailOrder","Edi")]
        [string]$type,
        [Parameter(ParameterSetName = "list")]
        [Alias("l")]
        [switch]$list, 
        [Parameter(ParameterSetName = "New")]
        [switch]$new,
        [Parameter(ParameterSetName = "Delete")]
        [switch]$delete,
        [string]$connectionstring
    )
}

Upvotes: 1

Views: 403

Answers (1)

Jeff Zeitlin
Jeff Zeitlin

Reputation: 10799

The error message is quite clear: PowerShell cannot resolve which parameter set to use in the case where you called it and received that error ("AmbiguousParameterSet"). The easiest way to correct this is to make at least one parameter in each parameter set that is unique to that parameter set a mandatory parameter; when I write functions like this, I usually make it the switch parameter. So, in this case, you'd make $new a mandatory parameter, and if you do not specify -new in the call, it will be able to resolve the call's parameter set to DoWork.

[Parameter(Mandatory=$true,ParameterSetName="New")]
[switch]$New

Incidentally, you don't need the [Alias("...")] on two of the parameters you've defined them for; PowerShell will take an unambiguous leading substring as an "alias" for the parameter - so since there's only one parameter that starts with each of 't' and 'l', calling with -t or -l will assume that you mean -type or -list respectively. If you omitted it from -domain, calling with -d would be ambiguous; you might have meant either -domain or -delete - but calling it with -del and -dom would resolve the ambiguity, as does establishing the -d alias.

Upvotes: 2

Related Questions