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