我的 Powershell 功能如下:
function myfunct {
param(
[Parameter(ParameterSetName="p1")]
[string] $p1,
[Parameter(ParameterSetName="p21")]
[string] $p21,
[Parameter(ParameterSetName="p22")]
[string] $p22
)
# ...
}
此脚本接受两种参数配置:
指定p1
的值:p1 and [not (p21 and p22)]
指定p21
和p22
的值:(not p1) and (p21 and p22)
现在,我想检查他们的共同排他性。通过阅读MSDN上的文章 PowerShell V2: ParameterSets ,我找到了一个示例,说明如何正确使用$PsCmdlet.ParameterSetName
的值来检查指定的参数:
function test-param
{
param(
[Parameter(ParameterSetName="p1",Position=0)]
[DateTime]
$d,
[Parameter(ParameterSetName="p2", Position=0)]
[int]
$i
)
switch ($PsCmdlet.ParameterSetName)
{
"p1" { Write-Host $d; break}
"p2" { Write-Host $i; break}
}
}
根据上面的示例,$PsCmdlet.ParameterSetName
返回单个参数的值,但在我的第二个配置中,我需要知道是否已插入p21
和p22
(如果当然,p1
是空的。
有没有办法按要求执行参数验证?如果是,怎么样?
答案 0 :(得分:2)
function Test(
[Parameter(ParameterSetName="ID")] [int]$ID,
[Parameter(ParameterSetName="Name")] [string]$Name,
[Parameter(ParameterSetName="Name")] [string]$Path
) {
switch ($PsCmdlet.ParameterSetName) {
'ID' {
"ID: $ID"
}
'Name' {
"Name: $Name Path: $Path"
}
}
}
如果需要,您还可以使用Mandatory=$true
强制执行某些参数。
没有必要检查“互斥性”。 PowerShell为您做到了这一点 - 这就是您首先定义参数集的原因。