You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
)

方案说明

  1. 参数集拆分逻辑:
    • 为Title和Username各创建三个参数集,分别对应仅自身、自身+DefaultObject、自身+AsPlainText,从根源上避免DefaultObject和AsPlainText出现在同一参数集内。
    • SearchString保留独立参数集,确保与Title/Username互斥。
    • Credential不指定任何ParameterSetName,这样它可以被添加到任意参数集的调用中,满足搭配任意参数或单独使用的要求。
  2. 默认参数集All:无任何参数传入时触发,符合无必填参数的规则。
  3. 自动校验:PowerShell会自动校验参数集合法性,若同时传入DefaultObject和AsPlainText,会因找不到匹配的参数集抛出错误,直接满足要求5。

内容的提问来源于stack exchange,提问作者Andrew Draper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:51:09