可以将两个参数之一传递给 powershell 脚本,但不能同时传递两个参数

Can pass powershell script one of two arguments, but not both arguments at the same time

我制作了一个简单的 powershell 脚本,它有两个参数。如果我尝试不带参数地执行脚本,它工作正常。如果我尝试使用两个参数中的任何一个来执行它,它都可以正常工作。当我尝试使用两个参数 运行 脚本时,出现以下错误:

Parameter set cannot be resolved using the specified named parameters.

它还有一个关于 AmibiguousParameterSet 的花絮。

我脚本的参数部分如下所示:

[CmdletBinding(DefaultParameterSetName="None")]
param(
    [Parameter(Mandatory=$False, ParameterSetName="BuildExclude")]
    [ValidateSet('proj1','proj2', 'proj3', 'proj4')]
    [string[]]$BuildExclude,
    [Parameter(Mandatory=$False, ParameterSetName="SkipDbRestore")]
    [switch]$SkipDbRestore
)

这些用法有效:

.\RunScript.ps1 -BuildExclude proj1, proj2
.\RunScript.ps1 -SkipDbRestore
.\RunScript.ps1 

由于上述原因,此用法无效:

.RunScript.ps1 -BuildExclude proj1, proj2 -SkipDbRestore

即使我颠倒参数的顺序也不起作用。我尝试添加参数位置,使 BuildExclude=0 和 SkipDbRestore=1,希望如果我至少让它们保持该顺序,我能够让它们一起工作。但这给了我同样的歧义错误。我错过了什么?理想情况下,我希望能够以任何顺序调用带有参数的脚本并让它做正确的事情。

参数集很像重载函数 - 您使用它们来指示您需要哪些参数。您的原始示例有两个参数集,每个参数集有一个参数。这迫使用户选择其中之一。在另一种情况下,您可能有一个函数,它要么采用参数 param1,要么采用参数 2 和参数 3。你会这样表达:

function Doit
{
    Param(
        [Parameter(Mandatory=$true, ParameterSetName="paramset1")]
        $param1,
        [Parameter(Mandatory=$true, ParameterSetName="paramset2")]
        $param2,
        [Parameter(Mandatory=$true, ParameterSetName="paramset2")]
        $param3
    )

    #code
}

参数集与强制性 true/false 相结合,可以极大地控制参数如何传递到您的函数中。

在您的示例中,您根本不需要指定参数集,因为您只有一个。所以你的函数的参数头可以这样指定:

function doit2
{
    param(
    [ValidateSet('proj1','proj2', 'proj3', 'proj4')]
    [string[]]$BuildExclude,
    [switch]$SkipDbRestore
    )
}