考慮這個功能:爲什麼不能根據[string] vs [hashtable] vs [pscustomobject]來解析參數集?
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]
才能正確解析。
我在翻譯the output from Trace-Command時沒有經驗。我也注意到輸出[string]
包括這一行:
BIND ARG [字符串]以PARAM [PsCustomObject]成功
這似乎是PowerShell是考慮[string]
是一個[PsCustomObject]
。但'string' -is [pscustomobject]
評估爲$false
。
這一切都讓我有以下問題:
- 爲什麼不能PowerShell中選擇一個基於
[string]
和[pscustomobject]
之間的類型的不同參數集? - 原因是PowerShell認爲
[string]
是[pscustomobject]
?如果是這樣,那爲什麼呢? - 是否有解決方法,允許我使用不同的類型來選擇不同的參數集?
據我所知,它被解析爲「String」和「PSObject」,這造成了簽名模糊性。因此錯誤記錄中的術語「AmbiguousParameterSet」。 – Eris