在创建函数后,是否可以在函数参数中添加验证属性?

时间:2014-02-26 05:22:54

标签: powershell

我发现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,所以我似乎无法在那里添加它。我只是在这里吠叫错了树吗?这不可能吗?

1 个答案:

答案 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
            }
        }