Как реализовать DynamicParam через параметры Dynami c? - PullRequest
0 голосов
/ 04 февраля 2020

Допущение:
$ a = 1,2,3
, если $ a = 1,2
Намерение: Показать параметр b

PS >test -<tab>
a
PS >test -a 1 -<tab>
b
PS >test -a 3 -<tab>

PS >test -a 3

Как добиться следующего намерение

Function test {
[CmdletBinding()]
Param()
DynamicParam {
parameter a
Dynamic parameter b (a is 1 =$true)
Dynamic parameter c (b is 3)
???
}
}

1 Ответ

0 голосов
/ 05 февраля 2020

Вы не должны предполагать. Исследуй это.

Что такое параметры динамики и как их использовать, если полностью документированный вариант использования представлен на сайте MS docs и во многих сообщениях в блогах.

Поиск ' параметров динамики powershell ' , даст вам список solid. Обязательно ознакомьтесь с деталями, чтобы не путать их варианты использования.

Примеры:

Как передать параметры Dynami c в сценарий powershell и выполнить итерацию по списку?

параметры командлета c параметры

PowerShell Deep Dive: обнаружение динамических параметров c параметры

Dynami c Параметры в PowerShell

Как реализовать Dynami c Параметры в функциях PowerShell введите описание ссылки здесь

# Example from the above link.

function Get-ConfigurationFile
{
    [OutputType([System.IO.FileInfo])]
    [CmdletBinding()]

    param
    ()

    DynamicParam
    {          
        $ParamAttrib  = New-Object System.Management.Automation.ParameterAttribute
        $ParamAttrib.Mandatory  = $true
        $ParamAttrib.ParameterSetName  = '__AllParameterSets'

        $AttribColl = New-Object  System.Collections.ObjectModel.Collection[System.Attribute]
        $AttribColl.Add($ParamAttrib)
        $configurationFileNames  = Get-ChildItem -Path 'C:\ConfigurationFiles' | Select-Object -ExpandProperty  Name
        $AttribColl.Add((New-Object  System.Management.Automation.ValidateSetAttribute($configurationFileNames)))

        $RuntimeParam  = New-Object System.Management.Automation.RuntimeDefinedParameter('FileName',  [string], $AttribColl)

        $RuntimeParamDic  = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary

        $RuntimeParamDic.Add('FileName',  $RuntimeParam)

        return  $RuntimeParamDic
    }
    process
    {
        $configFileFolder  = 'C:\ConfigurationFiles'
        Get-ChildItem  -Path $configFileFolder -Filter "$($PSBoundParameters.FileName).txt"          
    }
}

Что касается этого ...

Как видите, вкладки не могут возвращать параметр

..., то, что вы показываете этот вариант использования работает не так.

Исходя из того, что вам кажется, этот сэмплер должен вас туда привести. пожалуйста, прочитайте всю статью для лучшего понимания.

Dynami c Параметры в PowerShell

Function Get-Order {
[CmdletBinding()]
    Param(
      [Parameter(
         Mandatory=$true,
         Position=1,
         HelpMessage="How many cups would you like to purchase?"
      )]
      [int]$cups,

      [Parameter(
         Mandatory=$false,
         Position=2,
         HelpMessage="What would you like to purchase?"
      )]
      [ValidateSet("Lemonade","Water","Tea","Coffee")]
      [string]$product="Lemonade"
   )

   Process {
      $order = @()
      for ($cup = 1; $cup -le $cups; $cup++) {
          $order += "$($cup): A cup of $($product)"
      }
      $order
   }
}

Или этот ...

Использование Dynami c Параметры

function Test-Department
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$true)]
        [ValidateSet('Microsoft','Amazon','Google','Facebook')]
        $Company
    )

    dynamicparam
    {
        # this hash table defines the departments available in each company
        $data = @{
            Microsoft = 'CEO', 'Marketing', 'Delivery'
            Google = 'Marketing', 'Delivery'
            Amazon = 'CEO', 'IT', 'Carpool'
            Facebook = 'CEO', 'Facility', 'Carpool'
        }

        # check to see whether the user already chose a company
        if ($Company)
        {
            # yes, so create a new dynamic parameter
            $paramDictionary = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameterDictionary
            $attributeCollection = New-Object -TypeName System.Collections.ObjectModel.Collection[System.Attribute]

            # define the parameter attribute
            $attribute = New-Object System.Management.Automation.ParameterAttribute
            $attribute.Mandatory = $false
            $attributeCollection.Add($attribute)

            # create the appropriate ValidateSet attribute, listing the legal values for
            # this dynamic parameter
            $attribute = New-Object System.Management.Automation.ValidateSetAttribute($data.$Company)
            $attributeCollection.Add($attribute)

            # compose the dynamic -Department parameter
            $Name = 'Department'
            $dynParam = New-Object -TypeName System.Management.Automation.RuntimeDefinedParameter($Name,
            [string], $attributeCollection)
            $paramDictionary.Add($Name, $dynParam)

            # return the collection of dynamic parameters
            $paramDictionary
        }
    }

    end
    {
        # take the dynamic parameters from $PSBoundParameters
        $Department = $PSBoundParameters.Department

        "Chosen department for $Company : $Department"
    }
}

А также пошаговое руководство с полными пояснениями ...

Как: добавить параметры Dynami c в функции PowerShell

Как отмечалось в моем первоначальном ответе, существует множество примеров этого варианта использования , но это требует изучения, чтобы полностью gr asp концепции, и как использовать его / их.

...