以下 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
)