Получение динамических параметров командлета через отражение - PullRequest
3 голосов
/ 15 марта 2011

Powershell предоставляет некоторые параметры, " динамические параметры ", в зависимости от контекста.Страница MSDN довольно хорошо объясняет этот механизм, но, для того, чтобы узнать об этом, нужно вызвать GetDynamicParameters () , который возвращает класс, содержащий дополнительные параметры.Мне нужно получить эти параметры с помощью отражения и (в этом вся суть) в контексте ReflectionOnly (то есть типы загружаются с помощью ReflectionOnlyLoadFrom).Таким образом, нет Assembly.InvokeMember («GetDynamicParameters»).

Можно ли это сделать?

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

Нет. Отражение работает против статических метаданных сборки. Динамические параметры в powershell добавляются в время выполнения самой командой или функцией.

1 голос
/ 14 июля 2011

Возможно, это поможет:

1: определение динамических параметров

#===================================================================================
# DEFINITION OF FREE FIELDS USED BY THE CUSTOMER
#-----------------------------------------------------------------------------------
# SYNTAX: @{ <FF-Name>=@(<FF-Number>,<isMandatory_CREATE>,<isMandatory_UPDATE>); }
$usedFFs = @{               
                      "defaultSMTP"=@(2,1,0); `
                      "allowedSMTP"=@(3,1,0); `
                       "secondName"=@(100,1,0); `
                            "orgID"=@(30001,1,0); `
            "allowedSubjectTypeIDs"=@(30002,1,0); `
            }

# FF-HelpMessage for input          
$usedFFs_HelpMSG = @{ 2="the default smtp domain used by the organizaiton. Sampel:'algacom.ch'"; `
                      3="comma seperated list of allowed smtp domains. Sampel:'algacom.ch,basel.algacom.ch'"; `
                      100="an additional organization name. Sampel:'algaCom AG')"; `
                      30001="an unique ID (integer) identifying the organization entry"; `
                      30002="comma seperated list of allowed subject types. Sampel:'1,2,1003,10040'"; `
            }

2: определение функции, которая строит динамические параметры

#-------------------------------------------------------------------------------------------------------        
# Build-DynParams : Used to build the dynamic input parameters based on $usedFFs / $usedFFs_HelpMSG
#-------------------------------------------------------------------------------------------------------
function Build-DynParams($type) {
    $paramDictionary = New-Object -Type System.Management.Automation.RuntimeDefinedParameterDictionary

    foreach($ffName in $usedFFs.Keys) {
        $ffID = $usedFFs.Item($ffName)[0]
        $dynAttribCol = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute]
        $dynAttrib = New-Object System.Management.Automation.ParameterAttribute
        $dynAttrib.ParameterSetName = "__AllParameterSets"
        $dynAttrib.HelpMessage = $usedFFs_HelpMSG.Item($ffID)
        switch($type) {
            "CREATE" { $dynAttrib.Mandatory = [bool]($usedFFs.Item($ffName)[1]) }
            "UPDATE" { $dynAttrib.Mandatory = [bool]($usedFFs.Item($ffName)[2]) }
        }   
        $dynAttribCol.Add($dynAttrib)   
        $dynParam = New-Object -Type System.Management.Automation.RuntimeDefinedParameter($ffName, [string], $dynAttribCol)
        $paramDictionary.Add($ffName, $dynParam)        
    }
    return $paramDictionary         
}

3. Функция, которая использует динамические параметры

#-------------------------------------------------------------------------------------------------------
# aAPS-OrganizationAdd : This will add a new organization entry
#-------------------------------------------------------------------------------------------------------
Function aAPS-OrganizationAdd {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true,HelpMessage="The name of the new organization")] 
        [String]$Descr,
        [Parameter(Mandatory=$false,HelpMessage="The name of the parent organization")] 
        [String]$ParentDescr=$null,
        [Parameter(Mandatory=$false,HelpMessage="The status of the new organization [1=Active|2=Inactive]")] 
        [int]$Status = 1,
        [Parameter(Mandatory=$false,HelpMessage="If you want to see the data of the deactivated object")] 
        [switch]$ShowResult
    )
    DynamicParam { Build-DynParams "CREATE" }

    Begin {}

    Process {
        # do what oyu want here
    }

    End {}
}
...