2016-05-20 10 views
0

Make-Dinnerという関数を作成したいとします。この関数は{food、variant}の2つのパラメータをとります。食物の有効なセットは{ピザ、チキン}です。ただし、バリアントの有効なセットは、選択した食品の種類によって異なります。ユーザーがピザを選択した場合、有効なバリアントのセットは{cheese、pepperoni}です。ユーザがチキンを選択した場合、有効なバリエーションセット{フライド、グリル}。Powershellパラメータの有効なセットは、前のパラメータによって異なりますか?

これを実装するPowerShell関数を作成できますか?

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

Intellisense機能にはValidateSetを使用することを強くお勧めします。

答えて

0

PowershellはDynamic Parametersと呼ばれるこのクールな機能を備えています。これにより、他のパラメータに基づいてパラメータを定義することができます。完全なコードは次のようになります。

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

恐ろしいです。ありがとう!しかし、動的パラメータは連鎖できないようです。たとえば、最初のパラメータを動的に設定した場合、最初のパラメータに基づいて次のパラメータを動的にすることはできません。 –

関連する問題