PowerShell 无法确定正在使用的参数集 [英] PowerShell unable the determine which Parameter Set is in use

查看:58
本文介绍了PowerShell 无法确定正在使用的参数集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有四个参数的函数,其中两个可以设置也可以不设置.我正在尝试使用参数集来识别已设置的参数,但我在参数集解析方面遇到了一些问题.这些是四种可能的参数集 -

I have a function with four parameters, two of which can either be set or not. I'm trying to use Parameter Sets to identify which parameters have been set, but I'm hitting some issues with Parameter Set resolution. These are the four possible Parameter Sets -

  • NeitherErrorObjectOrSplunkData
  • BothErrorObjectAndSplunkData
  • OnlyErrorObject
  • 只有SplunkData

当我使用以下示例代码测试所有四个参数集时,仅错误对象仅部分 Splunk 数据 的测试均失败,并显示以下错误 -

When I test all four Parameter Sets using the example code below, the tests for Only an error object and Only some Splunk data both fail with the following error -

Test-ParameterSets : 无法使用指定的命名参数解析参数集.

Test-ParameterSets : Parameter set cannot be resolved using the specified named parameters.

根据我的研究,这似乎失败了,因为 PowerSehll 无法确定参数集应该是 BothErrorObjectAndSplunkData 还是 OnlyErrorObject/OnlySplunkData,我能理解.

From my research it seems that this fails because PowerSehll can't work out whether the Parameter Set should be BothErrorObjectAndSplunkData or OnlyErrorObject/OnlySplunkData, which I can understand.

如何更改我的代码以确定正在使用上述哪些参数集?如果参数集根本无法实现,我还能如何实现我的目标?

How can I alter my code to determine which of above Parameter Sets are in use? If it's simply not possible with Parameter Sets, how else can I achieve my goal?

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"

<小时>

示例代码输出


Example code output

既不是错误对象也不是 Splunk 数据 -
-- 参数集:NoneErrorObjectOrSplunkData

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

Test-ParameterSets:无法使用指定的命名参数解析参数集.
在行:31 字符:1
+ Test-ParameterSets -Message "Only an error object" -ErrorObject (New- ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Test-ParameterSets], ParameterBindingException
+ FullQualifiedErrorId : AmbiguousParameterSet,Test-ParameterSets

Test-ParameterSets : Parameter set cannot be resolved using the specified named parameters.
At line:31 char:1
+ Test-ParameterSets -Message "Only an error object" -ErrorObject (New- ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Test-ParameterSets], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Test-ParameterSets

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

Test-ParameterSets : Parameter set cannot be resolved using the specified named parameters.
At line:32 char:1
+ Test-ParameterSets -Message "Only some Splunk data" -SplunkData "Test ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Test-ParameterSets], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Test-ParameterSets

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

Both an error object and Splunk data -
-- Parameter Set: BothErrorObjectAndSplunkData

推荐答案

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

Specify that the $ErrorObject and $SplunkData variables are mandatory for these sets.

这将允许 PowerShell 区分这些集合,如果只提供一个,或者两者都提供.

This will allow PowerShell to distinguish between the sets if only one is provided, or both.

根据 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

这篇关于PowerShell 无法确定正在使用的参数集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆