2016-05-20 4 views
0

Angenommen, ich wollte eine Funktion erstellen, Make-Dinner. Diese Funktion benötigt zwei Parameter {food, variant}. Das gültige Set für Essen ist {Pizza, Huhn}. Der gültige Satz für die Variante hängt jedoch von der Art des ausgewählten Lebensmittels ab. Wenn der Benutzer Pizza auswählt, dann ist der gültige Satz von Varianten {Käse, Peperoni}. Wenn der Benutzer Hühnchen wählt, dann die gültige Variation (frittiert, gegrillt).Kann ein gültiger Powershell-Parameter abhängig von einem vorhergehenden Parameter variieren?

Kann eine PowerShell-Funktion erstellt werden, die dies implementiert?

SYNTAX 
    Make-Dinner -Food {Pizza, Chicken} 
    Make-Dinner -Food Pizza -Variant {Cheese, Pepperoni} 
    Make-Dinner -Food Chicken -Variant {Fried, Grilled} 

Ich würde sehr gerne ValidateSet für die Intellisense-Funktionen verwenden.

Antwort

0

Powershell hat dieses coole Feature namens Dynamic Parameters, mit dem Sie genau das tun können - definieren Sie Parameter basierend auf anderen Parametern. Der vollständige Code könnte wie folgt aussehen:

function Make-Dinner { 
[CmdletBinding()] 
param(
    [ValidateSet("Pizza","Chicken")] 
    $food 
) 

DynamicParam 
{ 
    $attributes = new-object System.Management.Automation.ParameterAttribute 
    $attributes.ParameterSetName = "__AllParameterSets" 
    $attributes.Mandatory = $false 
    $attributeCollection = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute] 
    $attributeCollection.Add($attributes) 

    $validvalues = switch($food) 
    { 
     "Pizza" { "Cheese","Pepperoni" } 
     "Chicken" { "Fried","Grilled" } 
     default { "" } 
     #$dynParam1 
    } 

    $validateset = new-object System.Management.Automation.ValidateSetAttribute -ArgumentList @($validvalues) 
    $attributeCollection.Add($validateset) 
    $dynParam1 = new-object -Type System.Management.Automation.RuntimeDefinedParameter("Variant", [string], $attributeCollection) 

    $paramDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary 
    $paramDictionary.Add("Variant", $dynParam1) 

    return $paramDictionary 
} 
Process {  
    $Variant = $PSBoundParameters["Variant"] 
    write-host "will make you a $food of variant $Variant" 
} 
} 

Intellisense Sample

+0

ehrfürchtig. Vielen Dank! Es scheint jedoch, dass die dynamischen Parameter nicht verkettet werden können. Wenn ich zum Beispiel den ersten Parameter als dynamisch einstelle, dann kann ich keinen Weg finden, wie der nächste Parameter auf der Grundlage des ersten dynamisch sein kann. –

Verwandte Themen