Почему привязка параметров успешна без аргументов, когда есть один набор параметров, но не с двумя?

У меня есть две функции. Первый имеет один набор параметров, второй имеет два набора параметров следующим образом:

function OneSet{
    [CmdletBinding()]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A')]$A )
    process { $PSCmdlet.ParameterSetName }
}

function TwoSets{
    [CmdletBinding()]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A',Mandatory = $true)]$A,
            [parameter(ParameterSetName = 'B',Mandatory = $true)]$B  )
    process { $PSCmdlet.ParameterSetName }
}

Вызов первого без аргументов приводит к привязке __AllParameterSets:

C:\> OneSet
__AllParameterSets

Вызов второго без аргументов вызывает исключение:

C:\> TwoSets
TwoSets : Parameter set cannot be resolved using the specified named parameters.
+ TwoSets
+ ~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [TwoSets], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,TwoSets

Я не понимаю, почему второй случай более неоднозначен, чем первый. Почему PowerShell не связывается с TwoSets с использованием "__AllParameterSets"набор параметров?

Есть ли (краткий) способ иметь несколько наборов параметров и при этом иметь возможность вызывать функцию без аргументов?


Редактировать: Добавлено Mandatory Ключевое слово, чтобы более точно представить мое затруднительное положение.

2 ответа

Решение

Я не понимаю, почему второй случай более неоднозначен, чем первый. Почему PowerShell не привязывается к TwoSets с помощью__AllParameterSets"набор параметров?

PowerShell, похоже, использует __AllParameterSets параметр устанавливается по умолчанию, когда существует только один пользовательский набор параметров. С другой стороны, когда существует более одного набора параметров с именами пользователей, PowerShell, похоже, не считает какой-либо набор параметров значением по умолчанию, если вы его не укажете.

Есть ли (краткий) способ иметь несколько наборов параметров и при этом иметь возможность вызывать функцию без аргументов?

Вы можете указать PowerShell использовать __AllParameterSets по умолчанию следующим образом:

function TwoSets{
    [CmdletBinding(DefaultParameterSetName = '__AllParameterSets')]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A', Mandatory = $true)]$A,
            [parameter(ParameterSetName = 'B', Mandatory = $true)]$B  )
    process { $PSCmdlet.ParameterSetName }
}

Затем вызывая без параметров, -A, или же -B Выход приводит к привязке к каждому из трех наборов параметров следующим образом:

PS C:\> TwoSets
__AllParameterSets

PS C:\> TwoSets -A 'a'
A

PS C:\> TwoSets -B 'b'
B

Это потому, что PowerShell не может определить, какой набор параметров вы пытаетесь использовать. Вы можете указать, что по умолчанию в атрибуте CmdletBinding.

function TwoSets{
    [CmdletBinding(DefaultParameterSetName='A')]
    param ( $NoSet,
            [parameter(ParameterSetName = 'A')]$A,
            [parameter(ParameterSetName = 'B')]$B  )
    process { $PSCmdlet.ParameterSetName }
}
Другие вопросы по тегам