PowerShell не может определить, какой набор параметров используется

У меня есть функция с четырьмя параметрами, два из которых можно либо установить, либо нет. Я пытаюсь использовать наборы параметров, чтобы определить, какие параметры были установлены, но я решаю некоторые проблемы с разрешением набора параметров. Это четыре возможных набора параметров -

  • NeitherErrorObjectOrSplunkData
  • BothErrorObjectAndSplunkData
  • OnlyErrorObject
  • OnlySplunkData

Когда я тестирую все четыре набора параметров с помощью приведенного ниже примера кода, тесты для Только объект ошибки и Только некоторые данные Splunk оба не выполняются со следующей ошибкой:

Test-ParameterSets: Набор параметров не может быть разрешен с использованием указанных именованных параметров.

Из моего исследования кажется, что это не удается, потому что PowerSehll не может понять, должен ли набор параметров быть BothErrorObjectAndSplunkData или же OnlyErrorObject/OnlySplunkData, который я могу понять.

Как я могу изменить свой код, чтобы определить, какой из вышеперечисленных наборов параметров используется? Если это просто невозможно с помощью наборов параметров, как еще я могу достичь своей цели?


Пример кода

function Test-ParameterSets
{
    [CmdLetBinding(DefaultParameterSetName="NeitherErrorObjectOrSplunkData")]
    param(
        [Parameter(Mandatory=$true)]
        [Parameter(ParameterSetName="NeitherErrorObjectOrSplunkData")]
        [Parameter(ParameterSetName="BothErrorObjectAndSplunkData")]
        [parameter(ParameterSetName="OnlyErrorObject")]
        [Parameter(ParameterSetName="OnlySplunkData")]

        [String]$Message,
        [parameter(ValueFromPipeline=$true)]
        [Parameter(ParameterSetName="BothErrorObjectAndSplunkData")]
        [parameter(ParameterSetName="OnlyErrorObject")]

        [Object]$ErrorObject,
        [Parameter(ParameterSetName="BothErrorObjectAndSplunkData")]
        [Parameter(ParameterSetName="OnlySplunkData")]

        [String[]]$SplunkData,
        [ValidateSet("ERROR", "WARN", "INFO")]
        [String]$Severity = "ERROR"
    )

    Write-Host "$message -"
    Write-Host "-- Parameter Set: $($PSCmdlet.ParameterSetName)`n"
    return
}

Test-ParameterSets -Message "Neither an error object or an Splunk data"
Test-ParameterSets -Message "Only an error object" -ErrorObject (New-Object -TypeName PSCustomObject)
Test-ParameterSets -Message "Only some Splunk data" -SplunkData "Test"
Test-ParameterSets -Message "Both an error object and Splunk data" -ErrorObject (New-Object -TypeName PSCustomObject) -SplunkData "Test"

Пример вывода кода

Ни объект ошибки, ни данные Splunk -
- Набор параметров: NeitherErrorObjectOrSplunkData

Test-ParameterSets: Набор параметров не может быть разрешен с использованием указанных именованных параметров.
В строке:31 символ: 1
+ Test-ParameterSets -Message "Только объект ошибки" -ErrorObject (New-...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo: InvalidArgument: (:) [Test-ParameterSets], ParameterBindingException
+ FullyQualifiedErrorId: AmbiguousParameterSet, Test-ParameterSets

Test-ParameterSets: Набор параметров не может быть разрешен с использованием указанных именованных параметров.
В строке:32 символа: 1
+ Test-ParameterSets -Message "Только некоторые данные Splunk" -SplunkData "Test...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo: InvalidArgument: (:) [Test-ParameterSets], ParameterBindingException
+ FullyQualifiedErrorId: AmbiguousParameterSet, Test-ParameterSets

И объект ошибки и данные Splunk -
- Набор параметров: BothErrorObjectAndSplunkData

1 ответ

Решение

Укажите, что $ErrorObject а также $SplunkData переменные обязательны для этих наборов.

Это позволит PowerShell различать наборы, если предоставляется только один, или оба.

отредактировано после комментариев Дэвида Гарда

function Test-ParameterSets
{
    [CmdLetBinding(DefaultParameterSetName="NeitherErrorObjectOrSplunkData")]
    param(
        # edit: removed ParameterSetName as belong to all sets so redundant
        [Parameter(Mandatory=$true)]
        [String]$Message,

        # edit: included ValueFromPipeline in the same Parameter declarations
        # as ParameterSetName
        [Parameter(ValueFromPipeline=$true, Mandatory=$true, ParameterSetName="BothErrorObjectAndSplunkData")]
        [parameter(ValueFromPipeline=$true, Mandatory=$true, ParameterSetName="OnlyErrorObject")]
        [Object]$ErrorObject,

        [Parameter(Mandatory=$true, ParameterSetName="BothErrorObjectAndSplunkData")]
        [Parameter(Mandatory=$true, ParameterSetName="OnlySplunkData")]
        [String[]]$SplunkData,

        [ValidateSet("ERROR", "WARN", "INFO")]
        [String]$Severity = "ERROR"
    )

    Write-Host "$message -"
    Write-Host "-- Parameter Set: $($PSCmdlet.ParameterSetName)`n"
    return
}

Test-ParameterSets -Message "Neither an error object or an Splunk data"
Test-ParameterSets -Message "Only an error object" -ErrorObject (New-Object -TypeName PSCustomObject)
Test-ParameterSets -Message "Only some Splunk data" -SplunkData "Test"
Test-ParameterSets -Message "Both an error object and Splunk data" -ErrorObject (New-Object -TypeName PSCustomObject) -SplunkData "Test"

Выход

Neither an error object or an Splunk data -
-- Parameter Set: NeitherErrorObjectOrSplunkData

Only an error object -
-- Parameter Set: OnlyErrorObject

Only some Splunk data -
-- Parameter Set: OnlySplunkData

Both an error object and Splunk data -
-- Parameter Set: BothErrorObjectAndSplunkData
Другие вопросы по тегам