PowerShell无法确定正在使用哪个参数集

时间:2017-07-19 11:27:58

标签: powershell parameter-sets

我有一个带有四个参数的函数,其中两个可以设置或不设置。我正在尝试使用参数集来识别已设置的参数,但我遇到了参数集分辨率的一些问题。这些是四个可能的参数集 -

  • NeitherErrorObjectOrSplunkData
  • BothErrorObjectAndSplunkData
  • OnlyErrorObject
  • OnlySplunkData

当我使用下面的示例代码测试所有四个参数集时,仅错误对象仅一些Splunk数据的测试均失败,并显示以下错误 - < / p>

  

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 char:1
  + Test-ParameterSets -Message“只有一个错误对象”-ErrorObject(New- ...
  + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
      + CategoryInfo:InvalidArgument:(:) [Test-ParameterSets],ParameterBindingException
      + FullyQualifiedErrorId:AmbiguousParameterSet,Test-ParameterSets

     

Test-ParameterSets:无法使用指定的命名参数解析参数集   在行:32 char:1
  + Test-ParameterSets -Message“只有一些Splunk数据”-SplunkData“Test ...
  + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
      + CategoryInfo:InvalidArgument:(:) [Test-ParameterSets],ParameterBindingException
      + FullyQualifiedErrorId:AmbiguousParameterSet,Test-ParameterSets

     

错误对象和Splunk数据 -
   - 参数集:BothErrorObjectAndSplunkData

1 个答案:

答案 0 :(得分:3)

指定$ErrorObject$SplunkData变量对于这些集合是必需的。

这将允许PowerShell区分这些集合,如果只提供一个集合,或两者兼而有之。

根据David Gard的评论编辑

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