Наборы параметров Powershell в других наборах параметров

У меня есть функция со следующими требованиями к параметрам:

  1. Нет обязательных параметров
  2. $Credential опционально может использоваться с любыми другими параметрами или без других параметров
  3. $Title, $Username и $SearchString нельзя использовать вместе.
  4. $DefaultObject и $AsPlainText можно использовать только с $Title или $Username.
  5. $DefaultObject и $AsPlainText нельзя использовать вместе.

Ниже то, что у меня есть на данный момент:

[CmdletBinding(DefaultParameterSetName = 'All')]
param (
    [PSCredential] $Credential,
    [Parameter(ParameterSetName = 'Title')]
    [string] $Title,
    [Parameter(ParameterSetName = 'Username')]
    [string] $Username,
    [Parameter(ParameterSetName = 'Search')]
    [string] $SearchString,
    [Parameter(ParameterSetName = 'Title')]
    [Parameter(ParameterSetName = 'Username')]
    [Parameter(ParameterSetName = 'DefaultObject')]
    [switch] $DefaultObject,
    [Parameter(ParameterSetName = 'Title')]
    [Parameter(ParameterSetName = 'Username')]
    [Parameter(ParameterSetName = 'PlainText')]
    [switch] $AsPlainText
)

Я выполнил пункты 1–4 в списке, но с пунктом 5 пытаюсь предотвратить одновременный вызов $DefaultObject и $AsPlainText. Кто-нибудь знает, как предотвратить их совместное использование? Я уже пытался создать новый набор параметров для каждого из них, но это не сработало.

Самый простой способ — просто вычислить if ($DefaultObject -and $AsPlainText), а затем $PSCmdlet.ThrowTerminatingError в теле вашей функции.

Santiago Squarzon 05.06.2024 00:31
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

DefaultParameterSetName вашей функции — «Все», но оно доступно только в том случае, если не используется «ни один» из параметров, поэтому я ожидаю, что вам нужно еще раз подумать о том, чего именно вы хотите и как это работает.

Но, судя по тому, что вы описали, этот код должен быть довольно близок к тому, что вы хотите. Важно понимать, что вам нужно использовать Mandatory, чтобы подчеркнуть, что определенные параметры являются обязательными для определенных наборов параметров:

Function Test-Params {
   [CmdletBinding(DefaultParameterSetName = 'All')]
   param (
      [Parameter(Mandatory = $false)]
      [PSCredential] $Credential,
      [Parameter(Mandatory = $true, ParameterSetName = 'Title')]
      [Parameter(Mandatory = $true, ParameterSetName = 'TitleDO')]
      [Parameter(Mandatory = $true, ParameterSetName = 'TitleAPT')]
      [string] $Title,
      [Parameter(Mandatory = $true, ParameterSetName = 'Username')]
      [Parameter(Mandatory = $true, ParameterSetName = 'UsernameDO')]
      [Parameter(Mandatory = $true, ParameterSetName = 'UsernameAPT')]
      [string] $Username,
      [Parameter(Mandatory = $true, ParameterSetName = 'Search')]
      [string] $SearchString,
      [Parameter(Mandatory = $true, ParameterSetName = 'TitleDO')]
      [Parameter(Mandatory = $true, ParameterSetName = 'UsernameDO')]
      [switch] $DefaultObject,
      [Parameter(Mandatory = $true, ParameterSetName = 'TitleAPT')]
      [Parameter(Mandatory = $true, ParameterSetName = 'UsernameAPT')]
      [switch] $AsPlainText
   )
   Write-Host $PSCmdlet.ParameterSetName
   switch ($PSCmdlet.ParameterSetName) {
      'All' {}
      'Title' {}
      'Username' {}
      'TitleDO' {}
      'UsernameDO' {}
      'TitleAPT' {}
      'UsernameAPT' {}
      'Search' {}
      Default {}
   }
}

Эти команды работают, а комментарии показывают выходные данные хоста:

## Commands ##                                    ## Write-Host ##
Test-Params                                        # All
Test-Params -Title 'MyTitle'                       # Title
Test-Params -Title 'MyTitle' -DefaultObject        # TitleDO
Test-Params -Title 'MyTitle' -AsPlainText          # TitleAPT
Test-Params -Username 'MyUsername'                 # Username
Test-Params -Username 'MyUsername' -DefaultObject  # UsernameDO
Test-Params -Username 'MyUsername' -AsPlainText    # UsernameAPT
Test-Params -SearchString 'My search text'         # Search

Но все эти ошибки выдают:

Test-Params -Title 'MyTitle' -Username 'MyUsername'
Test-Params -Title 'MyTitle' -SearchString 'My search text'
Test-Params -Username 'MyUsername' -SearchString 'My search text'
Test-Params -Title 'MyTitle' -Username 'MyUsername' -SearchString 'My search text'
Test-Params -SearchString 'My search text' -DefaultObject
Test-Params -SearchString 'My search text' -AsPlainText

Этот работает отлично, большое спасибо. Я не рассматривал возможность создания нескольких наборов для «Имя пользователя» и «Заголовок», но теперь я вижу, что это имеет большой смысл. Кроме того, набор «Все» относится к данным, возвращаемым функцией. Если ни «Заголовок», ни «Имя пользователя» не используются, по умолчанию возвращается все. Спасибо за отличное решение!

Andrew Draper 05.06.2024 15:24

@AndrewDraper, пожалуйста. Около года назад я потратил около двух недель свободного времени, просто пытаясь разобраться в том, как работают наборы параметров. Как только вы это поймете, их будет не так уж и сложно сделать, но все равно очень сложно сделать правильно. Начните с одного или двух параметров и заставьте его работать так, как вы хотите, затем добавьте еще один, заставьте его работать, затем добавьте еще один, заставьте его работать и т. д. Из опыта: попытка встроить все параметры в функцию на в то же время это кошмар.

Darin 05.06.2024 16:32

Я считаю, что вам просто нужно проложить путь снаружи внутрь. Вместо добавления наборов параметров в $DefaultObject добавьте набор параметров к другим нужным наборам:

Function Test {
[CmdletBinding()]
    param (
        [PSCredential] $Credential,

        [Parameter(ParameterSetName = 'DefaultObject')]
        [Parameter(ParameterSetName = 'Title')]
        [string] $Title,

        [Parameter(ParameterSetName = 'DefaultObject')]
        [Parameter(ParameterSetName = 'Username')]
        [string] $Username,

        [Parameter(ParameterSetName = 'Search')]
        [string] $SearchString,

        [Parameter(ParameterSetName = 'DefaultObject')]
        [switch] $DefaultObject,

        [Parameter(ParameterSetName = 'Title')]
        [Parameter(ParameterSetName = 'Username')]
        [Parameter(ParameterSetName = 'PlainText')]
        [switch] $AsPlainText
    )

}

help test

Производит:

    
SYNTAX
    Test [-Credential <pscredential>] [-Title <string>] [-AsPlainText]  [<CommonParameters>]
    
    Test [-Credential <pscredential>] [-Title <string>] [-Username <string>] [-DefaultObject]  [<CommonParameters>]
    
    Test [-Credential <pscredential>] [-Username <string>] [-AsPlainText]  [<CommonParameters>]
    
    Test [-Credential <pscredential>] [-SearchString <string>]  [<CommonParameters>]
    
    Test [-Credential <pscredential>] [-AsPlainText]  [<CommonParameters>]

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