Powershell 参数开关的 XNOR

Powershell 参数开关的 XNOR

以下 switch 参数是部分必需的。至少需要以下参数之一,但如果声明了其中任何一个,则两个配对参数都是必需的:

  • VS 和 PS
  • HS 和 DS
  • GS
  • CS

我有一个验证函数,可以将开关转换为bool数据类型,然后使用复杂的布尔代数进行检查,但我想使其更清晰并在编译时进行检查。

这可以通过参数集强制执行吗?

命令行参数参数列表

[CmdletBinding()]
param(
    [Parameter(Position=0,Mandatory)]
    [ValidateNotNullOrEmpty()]
    [string]$HlslScript,
    [Parameter(Mandatory=$false)]
    [Switch]$vs,
    [Parameter(Mandatory=$false)]
    [Switch]$hs,
    [Parameter(Mandatory=$false)]
    [Switch]$ds,
    [Parameter(Mandatory=$false)]
    [Switch]$gs,
    [Parameter(Mandatory=$false)]
    [Switch]$ps,
    [Parameter(Mandatory=$false)]
    [Switch]$cs
)

验证功能

function Verify-Args {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [bool]$vs,
        [Parameter(Mandatory)]
        [bool]$hs,
        [Parameter(Mandatory)]
        [bool]$ds,
        [Parameter(Mandatory)]
        [bool]$gs,
        [Parameter(Mandatory)]
        [bool]$ps,
        [Parameter(Mandatory)]
        [bool]$cs
    )
    $nostages = $false -eq ($vs -or $hs -or $ds -or $gs -or $ps -or $cs)
    if(!$nostages) {
        $vsps = !(!$vs -or !$ps) -and !($vs -xor $ps)
        $hsds = !(!$hs -or !$ds) -and !($hs -xor $ds)
        $invalid = -not ($vsps -or $hsds -or $gs -or $cs)
        if($invalid) {
            Write-Host "Missing required arguments. VS and PS, HS and DS, or GS, or CS"
            Return $false
        }
        Return $true
    } else {
        Write-Host "No shader stages specified."
        Return $false
    }
}

答案1

是的,参数集可行的方法如下:

[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [string]$OutputPath,
    [Parameter( Mandatory , ParameterSetName = 'VSPS' )]
    [Switch]$vs,
    [Parameter( Mandatory , ParameterSetName = 'VSPS' )]
    [Switch]$ps,
    [Parameter( Mandatory , ParameterSetName = 'HSDS' )]
    [Switch]$hs,
    [Parameter( Mandatory , ParameterSetName = 'HSDS' )]
    [Switch]$ds,
    [Parameter( Mandatory , ParameterSetName = 'GS' )]
    [Switch]$gs,
    [Parameter( Mandatory , ParameterSetName = 'CS' )]
    [Switch]$cs
)

编辑:根据此评论:

请澄清:正如@SimonS 在他的回答中指出的那样,我可以使用多个集合吗?可以想象,例如,使用粒子系统着色器-vs -ps -gs从点生成四边形;或者,使用生成的视觉曼德布洛特集-vs -ps -cs;或者通过镶嵌在 GPU 上生成动画平铺网格:-vs -ps -hs -ds -cs – Casey

上面的代码定义了四个参数集,正如所写的那样,它们相当严格,并且开关组合:

  • -vs -ps -gs
  • -vs -ps -cs
  • -vs -ps -hs -ds -cs

都会产生错误。要使-gs-cs 可作为其他参数集的可选开关,请添加指定 的附加参数属性,ParameterSetName但省略Mandetory。此代码允许所有请求的组合:

[CmdletBinding()]
param(
    [Parameter( Mandatory , Position = 0 )]
    [string]$OutputPath,
    [Parameter( Mandatory , ParameterSetName = 'VSPS')]
    [Switch]$vs,
    [Parameter( Mandatory , ParameterSetName = 'VSPS' )]
    [Switch]$ps,
    [Parameter( Mandatory , ParameterSetName = 'HSDS' )]
    [Parameter( ParameterSetName = 'VSPS')]
    [Switch]$hs,
    [Parameter( Mandatory , ParameterSetName = 'HSDS' )]
    [Parameter( ParameterSetName = 'VSPS')]
    [Switch]$ds,
    [Parameter( Mandatory , ParameterSetName = 'GS' )]
    [Parameter( ParameterSetName = 'VSPS')]
    [Parameter( ParameterSetName = 'HSDS')]
    [Switch]$gs,
    [Parameter( Mandatory , ParameterSetName = 'CS' )]
    [Parameter( ParameterSetName = 'VSPS')]
    [Parameter( ParameterSetName = 'HSDS')]
    [Switch]$cs
)

相关内容