如何在PowerShell函数中禁止$DefaultObject与$AsPlainText同时使用?
PowerShell函数参数集配置解决方案
参数要求
- 无必填参数
$Credential可与任意其他参数搭配使用,或单独使用$Title、$Username和$SearchString不可同时使用$DefaultObject和$AsPlainText仅能与$Title或$Username搭配使用$DefaultObject和$AsPlainText不可同时使用
原有实现代码
[CmdletBinding(DefaultParameterSetName = 'All')] param ( [PSCredential] $Credential, [Parameter(ParameterSetName = 'Title')] [string] $Title, [Parameter(ParameterSetName = 'Username')] [string] $Username, [Parameter(ParameterSetName = 'Search')] [string] $SearchString, [Parameter(ParameterSetName = 'Title')] [Parameter(ParameterSetName = 'Username')] [Parameter(ParameterSetName = 'DefaultObject')] [switch] $DefaultObject, [Parameter(ParameterSetName = 'Title')] [Parameter(ParameterSetName = 'Username')] [Parameter(ParameterSetName = 'PlainText')] [switch] $AsPlainText )
解决方案代码
要满足所有要求,尤其是阻止$DefaultObject和$AsPlainText同时调用,需要拆分参数集,为Title和Username分别创建带DefaultObject、带AsPlainText以及不带这两个开关的子参数集,同时让$Credential独立于参数集:
[CmdletBinding(DefaultParameterSetName = 'All')] param ( # 该参数不属于任何参数集,可与任意参数搭配或单独使用 [PSCredential] $Credential, # Title相关参数集:基础Title、Title+DefaultObject、Title+AsPlainText [Parameter(ParameterSetName = 'Title')] [Parameter(ParameterSetName = 'TitleWithDefaultObject')] [Parameter(ParameterSetName = 'TitleWithPlainText')] [string] $Title, # Username相关参数集:基础Username、Username+DefaultObject、Username+AsPlainText [Parameter(ParameterSetName = 'Username')] [Parameter(ParameterSetName = 'UsernameWithDefaultObject')] [Parameter(ParameterSetName = 'UsernameWithPlainText')] [string] $Username, # Search单独参数集,与Title/Username互斥 [Parameter(ParameterSetName = 'Search')] [string] $SearchString, # DefaultObject仅绑定到带它的Title/Username参数集 [Parameter(ParameterSetName = 'TitleWithDefaultObject')] [Parameter(ParameterSetName = 'UsernameWithDefaultObject')] [switch] $DefaultObject, # AsPlainText仅绑定到带它的Title/Username参数集 [Parameter(ParameterSetName = 'TitleWithPlainText')] [Parameter(ParameterSetName = 'UsernameWithPlainText')] [switch] $AsPlainText )
方案说明
- 参数集拆分逻辑:
- 为
Title和Username各创建三个参数集,分别对应仅自身、自身+DefaultObject、自身+AsPlainText,从根源上避免DefaultObject和AsPlainText出现在同一参数集内。 SearchString保留独立参数集,确保与Title/Username互斥。Credential不指定任何ParameterSetName,这样它可以被添加到任意参数集的调用中,满足搭配任意参数或单独使用的要求。
- 为
- 默认参数集
All:无任何参数传入时触发,符合无必填参数的规则。 - 自动校验:PowerShell会自动校验参数集合法性,若同时传入
DefaultObject和AsPlainText,会因找不到匹配的参数集抛出错误,直接满足要求5。
内容的提问来源于stack exchange,提问作者Andrew Draper
相关产品推荐
相关产品推荐

