PowerShell 无法确定正在使用的参数集 [英] PowerShell unable the determine which Parameter Set is in use
问题描述
我有一个带有四个参数的函数,其中两个可以设置也可以不设置.我正在尝试使用参数集来识别已设置的参数,但我在参数集解析方面遇到了一些问题.这些是四种可能的参数集 -
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屋!