Ottenere parametri dinamici di un cmdlet tramite riflessione
-
24-10-2019 - |
Domanda
PowerShell espone alcuni parametri, "parametri dinamici ", in base al contesto. La pagina di MSDN spiega il meccanismo abbastanza bene, ma il magro è quello di scoprire queste si devono chiamare GetDynamicParameters () , che restituisce una classe che contiene i parametri aggiuntivi. Ho bisogno di ottenere questi parametri attraverso la riflessione, e (ecco il punto cruciale di esso), in un contesto ReflectionOnly (che è, i tipi sono caricati con ReflectionOnlyLoadFrom). Quindi, non Assembly.InvokeMember ( "GetDynamicParameters").
Può questo essere fatto?
Soluzione
No. Riflessione lavora contro metadati assemblaggio statico. parametri dinamici powershell vengono aggiunti a runtime dal comando o funzione stessa.
Altri suggerimenti
Forse questo aiuta:
1: Defintion dei parametri dinamici
#===================================================================================
# 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: definizione della funzione che costruisce i parametri dinamici
#-------------------------------------------------------------------------------------------------------
# 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. Funzione che fa uso dei params dinamici
#-------------------------------------------------------------------------------------------------------
# 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 {}
}