可以将两个参数之一传递给 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
)
}
我制作了一个简单的 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
)
}