PowerShell参数集需要命名参数

yftpprvb  于 2022-12-13  发布在  Shell
关注(0)|答案(1)|浏览(123)

下面是一个函数的参数和它们的集合

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”参数?或者是否必须使用名称明确绑定参数?
有没有什么方法可以设计参数集,使我的最后一个例子工作,而不抛出一个错误?

t1qtbnec

t1qtbnec1#

用于参数集的逻辑看起来很好,但问题是有两个参数Position = 0-Message-Object),通常这不会是问题,但其中一个是System.Object类型,并且由于所有对象都继承自此类,无论您在位置0传递什么作为参数,它都将匹配此参数。由于Position = 0上的另一个参数是System.String类型,因此'Hello, World'(一个字符串,但也是一个对象)与两个参数集都匹配,而联编程序不知道您要使用哪一个。
一个非常简单的方法就是传递一个整数作为位置参数,而不需要更改当前代码,只需将$PSCmdlet.ParameterSetName添加到函数体中,这样一切都按预期运行:

function Test {
    [CmdletBinding(DefaultParameterSetName='StringConsole')]
    param(
        # same param block here
    )

    'Using: ' + $PSCmdlet.ParameterSetName
}

Test 0 -Path C:\SomeFile.txt # => Using: ObjectFile

相关问题