2011-03-14 81 views
3

Powershell基於上下文暴露了一些參數「dynamic parameters」。 MSDN頁面很好地解釋了這種機制,但最重要的是要找出這些必須調用GetDynamicParameters(),它返回一個包含附加參數的類。我需要通過反射來獲取這些參數,並且(這裏是關鍵所在),在ReflectionOnly上下文中(也就是說,類型使用ReflectionOnlyLoadFrom加載)。所以,沒有Assembly.InvokeMember(「GetDynamicParameters」)。通過反射獲取cmdlet的動態參數

可以這樣做嗎?

回答

2

編號反射對靜態彙編元數據有效。 PowerSHELL中的動態參數通過命令或函數本身在運行時上添加。

+0

這也是我的理解:(。我只是希望有人知道我剛纔沒有想到的一個聰明的解決方案。 – 2011-03-15 20:12:05

+1

沒有聰明的解決方案;只有煩人的,困難的。動態參數可以實現爲具有屬性的簡單類或RuntimeDefinedParameterDictionary。你必須猜測前面的類並反思它們,對於後者,你必須運行實際的代碼來構建字典。所以,答案仍然是否定的。抱歉。 – x0n 2011-03-16 00:52:08

1

也許這有助於:

1:動態參數的確定指標

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