0

我做了一个简单的PowerShell脚本有两个参数。如果我尝试执行没有参数的脚本,它可以正常工作。如果我试图用两个参数中的任何一个来执行它,它就可以正常工作。当我尝试用两个参数运行该脚本,我得到以下错误:可以通过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,希望我能够让他们一起工作,如果我至少保持他们的顺序。但是这给了我相同的模糊性错误。我错过了什么?理想情况下,我希望能够以任何顺序使用参数调用脚本,并让它做正确的事情。

回答

3

参数集非常类似于重载函数 - 您使用它们来指示您需要哪些参数。你最初的例子有两个参数集,每个参数集有一个参数。这迫使用户选择其中之一。在另一种情况下,你可能有一个函数,它要么参数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 
} 

帕拉姆集结合强制性真/假给出PARAMS如何传递到您的功能控制的巨大数额。

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

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