我如何提供一个选项卡完成列表,其中包含在 powershell 启动时生成的值?

How can I provide a tab completion list, with the values generated on powershell startup?

所以我有一个用 c# 编写的 cmdlet:Get-LivingCharacter。我希望用户像 Get-LivingCharacter -Name "Bran" 这样使用它,但我希望允许更改可用字符列表。也许今天,"Bran" 是为 Get-LivingCharacter 传递的有效名称,但也许在未来它不会。事情发生了。

为了方便起见,我想允许此字段的制表符完成。但是,我似乎无法让它适用于非常量数据集。动态字段甚至不会自动完成字段名称,更不用说值了,而且我不知道如何为非动态字段实现这一点。从概念上讲,我可以在给定当前数据集的情况下在启动时生成一个 .ps1 文件,然后将该 ps1 作为模块加载,但这感觉有点像用大剑杀死一只小狗 - 很多矫枉过正.还有更好的选择吗?

我已经实现了与DynamicParam helper function类似的功能,作为评论中的参考。但是,制表符补全不起作用。我正在写一个最小的复制示例,当...我的制表符完成工作时。

事实证明,它可重现 works/breaks 基于包含 WriteDebug 语句:

[Cmdlet("Get", "LivingCharacter")]
public class GetLivingCharacter : Cmdlet, IDynamicParameters
{
    protected override void ProcessRecord()
    {
    }

    public object GetDynamicParameters()
    {
        WriteDebug("Getting names"); // Tab completion won't work with this here - comment it out and it works.
        ^^^^^^^^^^

        var chars = new List<String>() { "Bran", "Arya" };            
        var dict = new RuntimeDefinedParameterDictionary();

        var attributes = new Collection<Attribute>
        {
            new ParameterAttribute
            {
                HelpMessage = "Enter a valid open name",
                Mandatory = true
            },
            new ValidateSetAttribute(chars.ToArray()),
        };

        dict.Add("Name", new RuntimeDefinedParameter("Name", typeof(string), attributes));

        return dict;
    }
}

经过一些挖掘,WriteDebug 语句抛出错误(我认为这是因为它在我输入时无法输出)。然后在我完成验证命令后重新创建 GetLivingCharacter class。花了一段时间才找到,因为这个问题,我无法将错误写入控制台,所以我不得不附加到一个临时文件。