Powershell Cmdlet的ValidateSet的Tab-Completion

时间:2014-11-26 23:38:29

标签: c# powershell validateset

我正在使用C#创建PowerShell cmdlet。对于其中一个参数,我使用ValidateSet

[ValidateNotNullOrEmpty]
[ValidateSet(new string[]{"STANDARD", "CUSTOM","MINIMUM","DEFAULT"},IgnoreCase=true)]
[Parameter(
    Mandatory = true,
    ValueFromPipelineByPropertyName = false,
    ValueFromPipeline = false,
    HelpMessage = "House Mode")
]
[Alias("hm")]
public string HouseMode
{
    get { return m_housemode; }
    set { m_housemode = value;  }
}   

如何使标签完成列表中显示ValidateSet的值?

2 个答案:

答案 0 :(得分:1)

这来自PSCX中的Format-Hex命令:

[Parameter(ParameterSetName = ParameterSetObject,
           ValueFromPipelineByPropertyName = true,
           HelpMessage = "The encoding to use for string InputObjects.  Valid values are: ASCII, UTF7, UTF8, UTF32, Unicode, BigEndianUnicode and Default.")]
[ValidateNotNullOrEmpty]
[ValidateSet("ascii", "utf7", "utf8", "utf32", "unicode", "bigendianunicode", "default")]
public StringEncodingParameter StringEncoding
{
    get { return _encoding; }
    set { _encoding = value; }
}

选项卡完成适用于此参数。在您的情况下,我认为您要指定如下属性:

[ValidateSet("STANDARD", "CUSTOM","MINIMUM","DEFAULT", IgnoreCase = true)]

答案 1 :(得分:1)

为避免重复,您还可以按如下方式在枚举中编码有效值。这就是我直接在PowerShell中完成它的方式,但是可能在c#代码中声明一个枚举也可以使用相同的内容。例如:

Add-Type -TypeDefinition @"
    public enum ContourBranch
    {
       Main,
       Planned,
       POP,
       Statements
    }
"@

然后将参数声明为该新类型,即

[CmdletBinding(SupportsShouldProcess=$True)]
param (
    [Parameter(Mandatory=$true)]
    [ContourBranch] $Branch 
)

这为您提供了标签完成功能,如果您得到错误的值,错误消息还会列出有效的枚举值,这非常简洁。