You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为基于类的动态ValidateSet添加额外值并修复Tab补全

在PowerShell动态ValidateSet中添加固定值并保留Tab补全

你遇到的问题根源是[ValidateSet]不支持同时混用动态值生成器([validNames])和静态值(如"*"),这种写法会导致验证逻辑冲突,既破坏Tab补全功能,又会触发无效值报错。

解决方法是将需要添加的固定值(*、?等)直接合并到动态生成器类返回的有效值数组中,让ValidateSet将所有动态文件名和固定特殊值统一视为合法选项,同时保留Tab补全功能。

修改后的完整代码:

Function fooo{
    Param(
        [ValidateSet([validNames], ErrorMessage = "'{0}' Is not a valid name")]
        [string]$Name
    )
    if ($name -in "*", "?") {
        "Modifier Used, do something special instead of the usual thing"
    }
    $name
}

Class validNames : System.Management.Automation.IValidateSetValuesGenerator{
    [string[]] GetValidValues(){
        # 获取C:\names目录下的文件名(不含扩展名)
        $fileNames = (Get-ChildItem -Path 'C:\names' -File).BaseName
        # 合并固定特殊值到有效值集合
        return $fileNames + @("*", "?")
    }
}

关键修改说明:

  • 合并静态值到动态集合:在GetValidValues方法中,将*、?添加到返回的文件名数组末尾,让动态生成的有效值集合同时包含文件名称和特殊修饰符。
  • 简化验证属性:移除[ValidateSet]中的静态值参数,仅保留动态生成器类,避免语法冲突。
  • 扩展特殊值判断:将判断逻辑改为$name -in "*", "?",方便后续快速添加更多特殊值。

效果验证:

  • Tab补全:输入fooo -Name 后按Tab,会循环显示C:\names下的所有文件名,以及*和?。
  • 验证逻辑:输入不存在的文件名会触发错误提示,输入*或?则会执行特殊逻辑分支。
  • 特殊值执行:直接输入fooo -Name *可以正常触发特殊处理,符合预期。

内容的提问来源于stack exchange,提问作者Ralf_Reddings

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:56:05