CmdletBinding 中的参数不是强制性的并且 error/misspelled 检查

Param in CmdletBinding not mandatory and error/misspelled checking

嘿,我有一个 powershell 脚本,我需要向其发送一些参数。但是,有时我不需要发送任何一个或者两者中的一个。

[CmdletBinding()]
param (
    [Parameter(ParameterSetName='SkipAutoLoader')][switch]$SkipAutoLoader,
    [Parameter(ParameterSetName='AppPool')][switch]$AppPool
)

[more code here....]

if (-not $SkipAutoLoader) {
    $services += "Auto Loader Service"
}

[more code here....]

以上工作正常,只要我有:

.\Start-AkkServides.ps1 -SkipAutoLoader

.\Start-AllServices -AppPool

如果我同时拥有:

.\Start-AllServices -SkipAutoLoader -AppPool

出错了。

C:\src\Start-AllServices.ps1 : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:1
+ .\Start-AllServices.ps1 -SkipAutoLoader -AppPool
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-AllServices.ps1], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Start-AllServices.ps1

我还希望能够确定参数是否具有有效的 -SkipAutoLoader and/or -AppPool 但是其他标记为 -SkipAutoLoader43

我想说 -SkipAutoLoaderbob 是一个无效参数。但如果任一参数不存在,则不显示错误。

Loads Fine: .\Start-AllServides.ps1 -SkipAutoLoader

Loads Fine: .\Start-AllServides.ps1 -AppPool

Does Not Load Fine/causes error: .\Start-AllServides.ps1 -SkipAutoLoader -AppPool

Does Not Load Fine/casues error: .\Start-AllServides.ps1

Does not say param is not valid: .\Start-AllServides.ps1 -SkipAutoLoaderbob

Does not say param is not valid: .\Start-AllServides.ps1 -AppPool7

可能与 powershell 有关?

  • 你的参数在单独的parameter sets中(只有[1]),所以设计它们不能一起使用

    • 如果你的参数可以自由组合,你根本不需要定义参数集。
  • 由于您的脚本是 advanced 脚本,感谢 [CmdletBinding()] and/or [Parameter()] 属性,使用未声明的参数名称调用是自动的阻止。

    • 但是,如果 only specify an unsupported parameter name (such as -SkipAutoLoaderbob): PowerShell then doesn't know which of the two defined parameter sets to select, 因为没有 declared 可以绑定参数(在考虑给定的参数名是否有效之前,可能有点意外)

    • 使用[CmdletBinding(DefaultParameterSetName='AppPool')],例如指定默认参数集。

假设您的两个参数可以自由组合并且都不是强制性的([switch] 参数无论如何都不应该),您的代码可以简化为:

[CmdletBinding()]
param (
  [switch] $SkipAutoLoader,
  [switch] $AppPool
)

# Output the name of the active parameter set.
$PSCmdlet.ParameterSetName

请注意,没有显式参数集成员资格的非强制参数(以及其他非默认参数属性)不需要 [Parameter()] 属性。

当您调用该脚本时,您会看到 PowerShell 隐式 在没有显式声明参数的情况下定义了一个参数集,名为 __AllParameterSets.


[1] 请注意,一个参数可以属于 多个 明确指定的参数集,通过多个 [Parameter(ParameterSetName= '...')] 属性。任何没有显式参数集成员身份的参数都是 所有 参数集的隐含部分。