mandatory
сделает оба параметра обязательными. Мне просто нужно убедиться, что либо path
, либо fileList
всегда присутствует.
Я обходился следующим, но это не идеально:
function foo{
Param(
[string[]]$path
[string[]]$fileList
)
if (($null -eq $path) -and ($fileList -eq "")){Write-Error -Message "Paths or FilieList must be used" -ErrorAction Stop}
}
Win11/ПВШ 7.4
Оба @SantiagoSquarzon предназначены для одновременного использования, по крайней мере, одного из них.
Попробуйте следующее:
function foo {
[CmdletBinding(DefaultParameterSetName = 'PathAndFileList')]
Param(
[Parameter(ParameterSetName='PathOnly', Mandatory)]
[Parameter(ParameterSetName='PathAndFileList', Mandatory)]
[string[]]$Path,
[Parameter(ParameterSetName='FileListOnly', Mandatory)]
[Parameter(ParameterSetName='PathAndFileList', Mandatory)]
[string[]]$FileList
)
# Diagnostic output: Show which parameters were bound.
$PSBoundParameters
}
Ключевым моментом является использование наборов параметров:
По одному набору параметров для каждого, если только один из двух параметров связан при вызове (PathOnly
, FileListOnly
).
Общий (PathAndFileList
), когда оба параметра связаны.
Помечая оба параметра как Mandatory
во всех наборах параметров, к которым они принадлежат, вызовы без аргументов вызывают интерактивное приглашение для предоставления значений обязательным параметрам или - в сеансах CLI, запускаемых через параметр -NonInteractive
- вызвать ошибку.
С помощью свойства DefaultParameterSetName
атрибута [CmdletBinding()]
вы можете выбрать
набор параметров по умолчанию, который при интерактивном выполнении, в свою очередь, определяет, какие параметры запрашиваются при вызовах без аргументов (или, вообще говоря, при вызовах, где не все обязательные параметры в целевом наборе параметров связаны).
Предостережение: если вы выберете PathAndFileList
в качестве набора параметров по умолчанию, оба -Path
и -FileList
будут запрашиваться в интерактивных вызовах без аргументов и не должны быть пустыми (по умолчанию параметры с типом массива не принимают пустой массив), т. е. вы должны укажите хотя бы одно значение для обоих, чтобы можно было совершить вызов.
Несмотря на наличие атрибута [AllowEmptyCollection()]
, проблема в том, что если вы добавите его к обоим параметрам, вы снова включите эффективный вызов без аргументов, если вы ничего не введете или не передадите @()
обоим параметрам.
Тем не менее, UX интерактивных подсказок, как правило, плохой и ограничен в отношении поддерживаемых типов параметров.
-NonInteractive
), что делает эту проблему спорной.Он работает на удивление хорошо, именно так, как мне было нужно. Я собираюсь узнать об этом наборе параметров. Спасибо.
Рад слышать, что это помогло, @Ralf_Reddings. Я добавил объяснение и ссылку на документацию к ответу. Обратите внимание на обсуждение проблемных аспектов интерактивных подсказок при отсутствии значений обязательных параметров.
Есть ли что-нибудь связанное с наборами параметров в дорожной карте PowerShell? Где я могу найти дорожную карту PowerShell? Я поискал в PowerShell/PowerShell-RFC, но ничего не нашел. Куда мне смотреть?
@lit, мне неизвестно об официальной дорожной карте, которая поддерживается на постоянной основе, на что, похоже, также указывает быстрый поиск в Интернете.
Вы хотите, чтобы был доступен только один из них, или оба параметра можно использовать вместе?