下面是一个函数的参数和它们的集合
function Test {
[CmdletBinding(DefaultParameterSetName='StringConsole')]
param (
[Parameter(Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName = 'ObjectFile')]
[Parameter(Mandatory,
ValueFromPipelineByPropertyName,
ParameterSetName = 'StringFile')]
[Alias("PSPath")]
[ValidateNotNullOrEmpty()]
[string]
$Path,
[Parameter(Mandatory,
ValueFromPipeline,
ParameterSetName='StringFile',
Position = 0)]
[Parameter(Mandatory,
ValueFromPipeline,
ParameterSetName='StringConsole',
Position = 0)]
[ValidateNotNullOrEmpty()]
[string]
$Message,
[Parameter(Mandatory,
ValueFromPipeline,
ParameterSetName='ObjectFile',
Position = 0)]
[Parameter(Mandatory,
ValueFromPipeline,
ParameterSetName='ObjectConsole',
Position = 0)]
[ValidateNotNullOrEmpty()]
[object]
$Object,
[Parameter(ParameterSetName='StringFile')]
[Parameter(ParameterSetName='StringConsole')]
[ValidateSet('Information', 'Verbose', 'Warning', 'Error', 'Object')]
[string]
$Severity = 'Information',
[Parameter(ParameterSetName='StringFile')]
[Parameter(ParameterSetName='StringConsole')]
[switch]
$NoPreamble,
[Parameter(ParameterSetName = 'StringConsole')]
[Parameter(ParameterSetName = 'ObjectConsole')]
[switch]
$Console
)
}
如果我使用
Test 'Hello, World'
它正确使用CmdletBinding
中的StringConsole
默认参数集
如果我使用
Test -Message 'Hello, World' -Path C:\SomeFile.txt
它正确使用了StringFile
参数集
但是如果我用
Test 'Hello, World' -Path C:\SomeFile.txt
我收到此错误,函数无法执行:
无法使用指定的命名参数解析参数集
该错误明确指出无法使用NAMED参数解析参数集。如果参数按位置绑定,它是否也满足“named”参数?或者是否必须使用名称明确绑定参数?
有没有什么方法可以设计参数集,使我的最后一个例子工作,而不抛出一个错误?
1条答案
按热度按时间t1qtbnec1#
用于参数集的逻辑看起来很好,但问题是有两个参数
Position = 0
(-Message
和-Object
),通常这不会是问题,但其中一个是System.Object
类型,并且由于所有对象都继承自此类,无论您在位置0传递什么作为参数,它都将匹配此参数。由于Position = 0
上的另一个参数是System.String
类型,因此'Hello, World'
(一个字符串,但也是一个对象)与两个参数集都匹配,而联编程序不知道您要使用哪一个。一个非常简单的方法就是传递一个整数作为位置参数,而不需要更改当前代码,只需将
$PSCmdlet.ParameterSetName
添加到函数体中,这样一切都按预期运行: