我发现this method动态更新参数的验证集成员。
这让我这样做:
Function MyFunction([ValidateSet("Placeholder")]$Param1) { "$Param1" }
Update-ValidateSet -Command (Get-Command MyFunction) -ParameterName "Param1" -NewSet @("red","green")
但有没有添加尚未出现的验证属性的方法?具体来说,我有一组功能,通过动态创建验证集将大大受益。但是,正如上面的链接所表明的那样,这是一个黑客攻击,将来可能会破裂。所以我不想放置占位符ValidateSet,以防将来需要删除它。基本上,我想做这样的事情:
Function MyFunction($Param1) { "Param1" }
Add-ValidateSet -Command (Get-Command MyFunction) -ParameterName "Param1" -NewSet @("red", "green")
这样,如果它确实破坏了,那么删除破坏代码会更容易。但是我无法让它发挥作用。我试过这样做:
$parameter = (Get-Command MyFunction).Parameters["P1"]
$set = "Red","Orange","Yellow","Green","Blue","Indigo","Violet"
$Attribute = new-object System.Management.Automation.ValidateSetAttribute $Set
$ValidValuesField = [System.Management.Automation.ValidateSetAttribute].GetField("validValues", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance)
$ValidValuesField.SetValue($Attribute, [string[]]$Set)
$parameter.Attributes.Add($Attribute)
但它不起作用。
(Get-Command MyFunction).Parameters["P1"].Attributes
显示已添加ValidateSet,但选项卡完成不起作用。将它与使用Update-ValidateSet函数的结果进行比较,看来差异在于该属性也应该出现在
下面(Get-Command MyFunction).ParameterSets[0].Parameters[0].Attributes
但是,这是一个ReadOnlyCollection,所以我似乎无法在那里添加它。我只是在这里吠叫错了树吗?这不可能吗?
答案 0 :(得分:3)
您可以使用动态参数完成此操作。在命令窗口中键入命令时,将评估动态参数。
这是about_Functions_Advanced_Parameters
function Get-Sample {
[CmdletBinding()]
Param ([String]$Name, [String]$Path)
DynamicParam
{
if ($path -match ".*HKLM.*:")
{
$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)
$dynParam1 = new-object `
-Type System.Management.Automation.RuntimeDefinedParameter("dp1", [Int32], $attributeCollection)
$paramDictionary = new-object `
-Type System.Management.Automation.RuntimeDefinedParameterDictionary
$paramDictionary.Add("dp1", $dynParam1)
return $paramDictionary
}
}