我有以下param()
块,其中包含大量ParameterSetNames
这是我用来在SQL表中更新,删除或创建新行的函数。
Set-User
#这将使用“列表”Set-User user value
#这将使用“DoWork”Set-User user value -new
#这将使用“新”Set-User user -delete
#这将使用“删除”但是由于我添加了“删除”和“新”参数集,我不能再使用“DoWork”了。为什么呢?
错误(不幸的是德语):
Set-User:Der Parametersatz kann mit den angegebenen benannten Parameternnichtaufgelöstwerden。在Zeile:1 Zeichen:1 + set-user用户值 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(:) [Set-user],ParameterBindingException + FullyQualifiedErrorId:AmbiguousParameterSet,Set-user
function Set-User {
[CmdLetBinding(DefaultParameterSetName = "list")]
param(
[Parameter(ParameterSetName = "DoWork", Mandatory = $true, Position = 0)]
[Parameter(ParameterSetName = "New", Mandatory = $true, Position = 0)]
[Parameter(ParameterSetName = "Delete", Mandatory = $true, Position = 0)]
[Alias("d")]
[string]$domain,
[Parameter(ParameterSetName = "DoWork", Mandatory = $true, Position = 1)]
[Parameter(ParameterSetName = "New", Mandatory = $true, Position = 1)]
[Alias("t")]
[ValidateSet("XMLOrder","EdiOrder","EmailOrder","Edi")]
[string]$type,
[Parameter(ParameterSetName = "list")]
[Alias("l")]
[switch]$list,
[Parameter(ParameterSetName = "New")]
[switch]$new,
[Parameter(ParameterSetName = "Delete")]
[switch]$delete,
[string]$connectionstring
)
}
答案 0 :(得分:2)
错误消息非常明确:PowerShell无法解析在您调用它并收到该错误的情况下使用哪个参数集(" AmbiguousParameterSet")。解决此问题的最简单方法是在每个参数集中至少创建一个参数,该参数对于该参数集是唯一的必需参数;当我写这样的函数时,我通常把它作为switch参数。因此,在这种情况下,您需要$new
作为必填参数,如果您未在通话中指定-new
,则可以解析通话的参数集去做。
[Parameter(Mandatory=$true,ParameterSetName="New")]
[switch]$New
顺便说一下,您不需要[Alias("...")]
关于您为其定义的两个参数; PowerShell将明确的前导子字符串作为"别名"对于参数 - 所以因为只有一个参数以每个参数开始。和' l',使用-t
或-l
进行通话会假设您分别指-type
或-list
。如果您从-domain
中省略了它,则使用-d
进行调用将不明确;你可能意味着-domain
或-delete
- 但是使用-del
和-dom
调用它可以解决歧义,就像建立-d
别名一样。