Попытка динамического использования параметров с помощью powershell - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь настроить параметры динамического c, которые меняются в зависимости от того, добавляете ли вы или модифицируете / удаляете дрон. Пример: если вы добавляете дрон, вам понадобится его IP / имя / местоположение. Чтобы удалить дрон, вам понадобится только его имя. Я пробовал смотреть онлайн и пробовать различные примеры, которые я видел, но я полностью застрял здесь. Буду признателен за любую помощь, чтобы направить меня в правильном направлении. Я немного новичок в PowerShell. Вот что у меня есть.

[CmdletBinding(SupportsShouldProcess=$True)]
Param(  [Parameter(Mandatory=$true,
        HelpMessage = "Add remove or Modify a drone?")]
        [ValidateSet("Add", "Remove", "Modify")]
        [String]$Action)


      DynamicParam{

        if ($action = "Add"){

            Param( [Parameter(Mandatory)]
            [ValidateSet("NorthAmerica", "SouthAmerica", "NorthernEurope","UK", "CEE", "FRMALU", "SouthernEurope", "AsiaPacific")]
            [String]$curRegion,
            [Parameter(Mandatory)]
            [IPAddress]$ip,
            [Parameter(Mandatory)]
            [String]$droneName)

        }
        if ($action = "Remove"){
            Param( 
                [Parameter(Mandatory)]
                [string]$droneRemoveName)
        }

    }

1 Ответ

1 голос
/ 13 января 2020

Рассмотрите возможность управления вашими ограничениями параметров с именованными наборами параметров . Я предлагаю это, потому что параметры Dynami c работают не совсем так, как вы думаете, а именованные наборы параметров - более простой способ решения вашей проблемы. В случае, если вам интересно, вот сообщение в блоге, объясняющее , как использовать параметры Dynami c, и это приводит к довольно ручной обработке параметров.

Вы можете добавить параметр к более чем один набор параметров в зависимости от контекста, в котором требуется каждый параметр. Вместо использования -Action ACTION в качестве драйвера для параметра Dynami c, используйте вместо него [switch], например, -Add и -Remove, и у каждого переключателя есть свой собственный набор параметров. Например, при определении ваших параметров это может выглядеть примерно так:

Param(
  [Parameter(ParameterSetName='Remove')]
  [switch]$Remove,
  [Parameter(ParameterSetName='Add')]
  [switch]$Add,
  [Parameter(ParameterSetName='Remove', Mandatory)]
  [Parameter(ParameterSetName='Add', Mandatory)]
  [string]$IPAddress
)

В этом примере -IPAddress действует при использовании переключателя -Add или -Remove, но не будет быть релевантным вне этого контекста. Конечно, если параметр должен быть действительным только для определенного набора параметров, не определяйте его под более чем одним именем набора параметров.


Если вы хотите убедиться, что хотя бы одно «действие» параметр switch задан перед выполнением, вы можете проверить, что один из этих параметров использовался при вызове командлета, проверив $PSBoundParameters:

('Add' -in $PSBoundParameters.Keys) -Or ('Remove' -in $PSBoundParameters.Keys)
...