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= '...')]
属性。任何没有显式参数集成员身份的参数都是 所有 参数集的隐含部分。
嘿,我有一个 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= '...')]
属性。任何没有显式参数集成员身份的参数都是 所有 参数集的隐含部分。