之前已经发布了一次,但建议的解决方案并没有解决我的问题。我正在写一个脚本,我希望我的一个参数是强制性的,但我只希望它是强制性的,如果其中一个早期参数具有一定的值。
示例:
param([Parameter(Mandatory=$true, Position=0)]
[ValidateSet("Add","Delete")]
[string]$Command,
[Parameter(Mandatory=$true)]
[string]$Subject
)
我希望仅当Command参数的值为“Add”时才需要Subject参数。
我尝试过使用ParameterSetName值,但这似乎不起作用。
答案 0 :(得分:2)
您可以尝试执行以下参数:
param (
[Parameter(ParameterSetName="Add")][switch]$Add,
[Parameter(ParameterSetName="Delete")][switch]$Delete,
[Parameter(ParameterSetName="Add",Mandatory=$true)] [Parameter(ParameterSetName="Delete")] [string]$Subject
)
如果您有“添加”开关,则必须使用主题,当您有“删除”开关时,主题参数是可选的。
答案 1 :(得分:2)
您可以选择主题并在脚本正文的开头处理需求,模拟必需参数,如下所示:
param(
[parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command,
[string] $Subject
)
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) {
$Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add")'
}
如果未指定参数主题,则条件$PSBoundParameters['Subject'] -eq $null
的计算结果为True。请注意,不能只使用$Subject -eq $null
,因为如果省略参数, $ Subject 会初始化为空字符串。如果你没有强加 $ Subject (即省略[string]
),那么如果它被省略它将为null,但我认为你不想这样做。 / p>
请注意,此将允许用户在提示时简单地按[ENTER],将 $ Subject 留空,但这是必需参数的标准行为。如果您不想允许,可以执行以下操作之一(这是在正文中处理复杂参数要求的另一个优点,而不是参数声明)。
抛出错误:
param(
[parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command,
[string] $Subject
)
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) {
$Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add"'
if (-not $Subject) {
throw "The Subject may not be blank."
}
}
继续提示,直到提供值:
param(
[parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command,
[string] $Subject
)
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) {
do {
$Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add"'
if (-not $Subject) {
Write-Host -NoNewline "The Subject may not be blank. "
}
} until ($Subject)
}