假设我想创建一个函数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功能。
答案 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"
}
}