Используйте значение по умолчанию для параметра -Two
, чтобы принудительно применить требуемые логи c, с помощью оператора if
, который использует Throw
:
param (
[Parameter(Mandatory, ParameterSetName = 'default')]
[ValidateSet('aaa', 'bbb', 'ccc', 'ddd')]
[String]
$One,
[Parameter(ParameterSetName = 'default')]
[String]
$Two = $(if ($One -eq 'bbb') { Throw "-Two must be passed if -One equals 'bbb'." })
)
"-One: $One; -Two: $Two"
Примечание: Эмуляция (условно) обязательного параметра с Throw
означает, что поведение отличается от обычного Mandatory
параметром в том, что последний запрашивает , когда значение равно не дано.
Было бы предпочтительнее решение, основанное на атрибутах проверки, но атрибуты проверки не предназначены для перекрестной проверки параметров и не имеют определенного порядка их оценка гарантирована.
Приведенное выше решение основано на том факте, что значения по умолчанию оцениваются после того, как были связаны явно переданные аргументы.
Гораздо более многословной альтернативой является использование динамика c параметра , как показано в Ответ Васиф Хасана , полагается на то же время, хотя и имеет преимущество, демонстрируя нормальное поведение подсказки для пропущенного обязательного значения.
На момент написания статьи ответ Васифа не работал в том виде, в котором он был опубликован, Итак, вот рабочее решение; обратите внимание, что использование DynamicParam
синтаксически требует (хотя бы одного) блоков begin
, process
и end
.
# Syntax requires PSv5+:
using namespace System.Management.Automation
param(
[Parameter(Mandatory, ParameterSetName='default')]
[ValidateSet('aaa', 'bbb', 'ccc', 'ddd')]
[String]$One
)
# Define parameter -Two *dynamically*, so that its Mandatory property
# can be based on the specific value of the already-bound static -One parameter.
DynamicParam {
# Create a the dictionary of dynamic parameters.
$dict = [RuntimeDefinedParameterDictionary]::new()
# Define and add the -Two parameter
$paramName = 'Two'
$dict.Add(
$paramName,
[RuntimeDefinedParameter]::new(
$paramName,
[string],
[ParameterAttribute] @{
ParameterSetName = 'default'
# *Conditionally* make the parameter mandatory, depending on the value
# of the already-bound static -One parameter.
Mandatory = $One -eq 'bbb'
}
)
)
# Return the dictionary
return $dict
}
begin {
# NOTE: Dynamic parameter values do not become local variables the way
# they do for static parameters; the value must be accessed via the
# automatic $PSBoundParameters dictionary.
$Two = $PSBoundParameters['Two']
"-One: $One; -Two: $Two"
}