我制作了一个简单的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,希望我能够让它们一起工作,如果我至少保持它们的顺序。但这给了我同样的歧义错误。我错过了什么?理想情况下,我希望能够以任何顺序使用参数调用脚本并让它做正确的事情。
答案 0 :(得分:3)
参数集很像重载函数 - 您可以使用它们来指示您需要哪些参数。您的原始示例有两个参数集,每个参数集中包含一个参数。这会强制用户选择其中一个。在另一种情况下,你可能有一个函数,它需要param param1,或param2和param3。你是这样说的:
function Doit
{
Param(
[Parameter(Mandatory=$true, ParameterSetName="paramset1")]
$param1,
[Parameter(Mandatory=$true, ParameterSetName="paramset2")]
$param2,
[Parameter(Mandatory=$true, ParameterSetName="paramset2")]
$param3
)
#code
}
Param设置与强制性true / false结合使用,可以对params传递到函数中的方式进行大量控制。
在您的示例中,您根本不需要指定一个参数集,因为您只有一个参数集。因此,函数的param头可以这样指定:
function doit2
{
param(
[ValidateSet('proj1','proj2', 'proj3', 'proj4')]
[string[]]$BuildExclude,
[switch]$SkipDbRestore
)
}