考虑这个函数:
function Test-Discrimination
{
[CmdletBinding()]
param
(
[parameter(ValueFromPipeline = $true,
Mandatory = $true,
ParameterSetName = 'string')]
[string]
$String,
[parameter(ValueFromPipeline = $true,
Mandatory = $true,
ParameterSetName = 'hashtable')]
[hashtable]
$Hashtable,
[parameter(ValueFromPipeline = $true,
Mandatory = $true,
ParameterSetName = 'pscustomobject')]
[pscustomobject]
$PsCustomObject
)
process
{
$PSCmdlet.ParameterSetName
}
}
管道[pscustomobject]
的行为符合我的预期:
PS C:\> New-Object pscustomobject | Test-Discrimination
pscustomobject
但是,管道[string]
会引发异常:
PS C:\> 'string' | Test-Discrimination
Test-Discrimination : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:12
+ 'string' | Test-Discrimination
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (string:String) [Test-Discrimination], Paramete
rBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Test-Discrimination
也是如此[hashtable]
:
PS C:\> @{} | Test-Discrimination
Test-Discrimination : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:7
+ @{} | Test-Discrimination
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (System.Collections.Hashtable:Hashtable) [Test-
Discrimination], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Test-Discrimination
添加DefaultParameterSetName='hastable'
原因[hashtable]
但无法[string]
正确解决。
我在解释Trace-Command 的输出方面没有经验。我确实注意到输出[string]
包括这一行:
BIND arg [string] 到参数 [PsCustomObject] SUCCESSFUL
这似乎 PowerShell 正在考虑[string]
成为一个[PsCustomObject]
. 但'string' -is [pscustomobject]
评估为$false
。
这一切都给我留下了以下问题:
[string]
为什么 PowerShell 不能根据 a和 a的类型差异来选择参数集[pscustomobject]
?- 原因是 PowerShell 认为 a
[string]
是 a[pscustomobject]
吗?如果是这样,为什么会这样? - 是否有一种解决方法可以让我使用不同的类型来选择不同的参数集?