Powershell参数的有效集可以根据前面的参数而变化吗?

时间:2016-05-20 03:41:40

标签: validation powershell parameters

假设我想创建一个函数Make-Dinner。该函数有两个参数{food,variant}。有效的食物集是{pizza,chicken}。但是,变体的有效集取决于所选食物的类型。如果用户选择披萨,则有效的变体集是{cheese,pepperoni}。如果用户选择鸡肉,那么有效的变异集{fried,grilled}。

是否可以创建实现此功能的PowerShell功能?

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

我更倾向于使用ValidateSet作为intellisense功能。

1 个答案:

答案 0 :(得分:1)

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