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

Han*_*ror 0 parameters powershell scripting parameter-passing optional-parameters

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

Parameter set cannot be resolved using the specified named parameters.
Run Code Online (Sandbox Code Playgroud)

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

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

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

这些用法有效:

.\RunScript.ps1 -BuildExclude proj1, proj2
.\RunScript.ps1 -SkipDbRestore
.\RunScript.ps1 
Run Code Online (Sandbox Code Playgroud)

由于上述原因,此用法不起作用:

.RunScript.ps1 -BuildExclude proj1, proj2 -SkipDbRestore
Run Code Online (Sandbox Code Playgroud)

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

Tro*_*ndh 5

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

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

    #code
}
Run Code Online (Sandbox Code Playgroud)

参数集与强制 true/false 相结合,可以对如何将参数传递到您的函数中进行大量控制。

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

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