Как сделать один из двух параметров обязательным, чтобы всегда присутствовал хотя бы один из двух?

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

Вы хотите, чтобы был доступен только один из них, или оба параметра можно использовать вместе?

Santiago Squarzon 23.06.2024 17:44

Оба @SantiagoSquarzon предназначены для одновременного использования, по крайней мере, одного из них.

Ralf_Reddings 23.06.2024 18:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте следующее:

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 интерактивных подсказок, как правило, плохой и ограничен в отношении поддерживаемых типов параметров.

      • См. выпуск GitHub № 4068 для обсуждения, включая предложение всегда выдавать ошибку при отсутствии обязательного значения параметра (как в случае с -NonInteractive), что делает эту проблему спорной.

Он работает на удивление хорошо, именно так, как мне было нужно. Я собираюсь узнать об этом наборе параметров. Спасибо.

Ralf_Reddings 23.06.2024 18:37

Рад слышать, что это помогло, @Ralf_Reddings. Я добавил объяснение и ссылку на документацию к ответу. Обратите внимание на обсуждение проблемных аспектов интерактивных подсказок при отсутствии значений обязательных параметров.

mklement0 23.06.2024 19:15

Есть ли что-нибудь связанное с наборами параметров в дорожной карте PowerShell? Где я могу найти дорожную карту PowerShell? Я поискал в PowerShell/PowerShell-RFC, но ничего не нашел. Куда мне смотреть?

lit 24.06.2024 00:35

@lit, мне неизвестно об официальной дорожной карте, которая поддерживается на постоянной основе, на что, похоже, также указывает быстрый поиск в Интернете.

mklement0 24.06.2024 00:54

Другие вопросы по теме