Почему привязка параметров успешна без аргументов, когда есть один набор параметров, но не с двумя?
У меня есть две функции. Первый имеет один набор параметров, второй имеет два набора параметров следующим образом:
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 }
}