mayho33
Goto Top

Powershell DynamicParam ValitateSetAtrribute

Hallo @ All,

Ich suche nach einer Lösung für DynamicParam mit ValitateSetAtrribute + normalen Parametern und hoffe wieder mal auch eure Unterstützung

Was genau will ich tun?

wie hier im Beispiel zu sehen ist soll es einen DymaicParam mit ValidateSetAttribute geben
function Get-Products
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$false, ValueFromPipeline=$true, Position=1, ParameterSetName="CHECK")][switch]$IsInstalled  
        )

    DynamicParam
    {
        if($IsInstalled)
        {
            $attrValidateCollection   = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
            $paramValidateDic         = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
            $attrValidate             = New-Object System.Management.Automation.ParameterAttribute
            $attrValidate.Position    = 2
            $attrValidate.Mandatory   = $false
            $attrValidate.HelpMessage = "explicit seach only in this registry-architecture"                

            
            $attrValidateCollection.add($attrValidate)
            $attrValidateCollection.add((New-Object System.Management.Automation.ValidateSetAttribute("32-Bit","64.Bit","Both")))  
            $paramValidateDic.Add("Archtecture",(New-Object System.Management.Automation.RuntimeDefinedParameter("Archtecture",[string],$attrValidateCollection)))  
            return $paramValidateDic
        }
    }
}

Das funktioniert sehr gut, leider ist es nur die halbe Miete, denn ich möchte weitere Parameter dynamisch einbinden.

Füge ich diese Parameter hinzu...
$paramValidateDic.Add("ProductName", (new-object System.Management.Automation.RuntimeDefinedParameter("ProductName", [string], $attrValidateCollection)))  
$paramValidateDic.Add("ProductVersion", (new-object System.Management.Automation.RuntimeDefinedParameter("ProductVersion", [string], $attrValidateCollection)))  
...werden sie zwar angezeigt, erhalten aber ebenfalls die angegebenen ValidateSetAttributes.

Mir ist klar, dass dies im obigen Beispiel gar nicht anders geht, weil ich das ValidateSet der $attrValidateCollection hinzufüge und deshalb für alle Parameter gilt. Soweit ich DynamicParams verstanden habe, kann man aber nur ein Object zurück geben.

Was also muss ich tun, bzw. wo muss ich den Code ändern, dass die DynamicParameters "ProductName" und "ProductVersion" das ValidateSet nicht erhalten?

Vielen Dank für eure Hilfe!

Beste Grüße!

mayho

Content-Key: 387569

Url: https://administrator.de/contentid/387569

Printed on: April 26, 2024 at 16:04 o'clock

Member: colinardo
Solution colinardo Sep 25, 2018, updated at Sep 26, 2018 at 10:52:20 (UTC)
Goto Top
Servus mayho,
Soweit ich DynamicParams verstanden habe, kann man aber nur ein Object zurück geben.
Ein Dictionary, aber für jeden Parameter kannst du eine eigene Collection definieren.
Du brauchst also für jeden Parameter eine separate Collection (System.Collections.ObjectModel.Collection[System.Attribute])

Hier ein Beispiel:

function Get-Products {
    param(
        [parameter(ParameterSetName="Check")][switch]$IsInstalled  
    )

    DynamicParam{
        
       

        if ($IsInstalled.IsPresent){
              $attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute]
             $attrCollection2 = new-object System.Collections.ObjectModel.Collection[System.Attribute]
            $paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary
            # Attribute für Parameter 1 definieren
            $attr = new-object System.Management.Automation.ParameterAttribute
            $attr.Mandatory = $false
            $attrValidate = New-Object ValidateSet('32bit','64bit','Both')  
            $attrCollection.Add($attr)
            $attrCollection.Add($attrValidate)
            
            # Attribute für Parameter 2 definieren
            $attr2 = new-object System.Management.Automation.ParameterAttribute
            $attr2.Mandatory = $false
            $attrValidate2 = New-Object ValidateSet('Test1','Test2','Test3')  
            $attrCollection2.Add($attr2)
            $attrCollection2.Add($attrValidate2)


            # Parameter definieren
            $dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingA1", [String], $attrCollection)  
            $dynParam2 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingA2", [String], $attrCollection2)  
            
            # Parameter zum Dictionary hinzufügen
            $paramDic.Add("DoingA1", $dynParam1)  
            $paramDic.Add("DoingA2", $dynParam2)  
            return $paramDic
        }

    }

    begin{}
    
    process{
        write-host $PSBoundParameters.DoingA1
        write-host $PSBoundParameters.DoingA2
    }
    
    end{}
}

Get-Products -IsInstalled -DoingA1 32bit -DoingA2 Test1
Grüße Uwe

P.s. Die Tippfehler im Titel darfst du gerne auch nachträglich noch ausmerzen face-wink.
Member: mayho33
mayho33 Oct 19, 2018 at 06:16:55 (UTC)
Goto Top
Hi colinardo,

sorry wegen der sehr späten Rückmeldung! Und Danke für das Beispiel.

Leuchtet ein und hat auf Anhieb funktioniert.

Beste Grüße!

mayho