如何提供选项卡完成列表,并在powershell启动时生成值?

时间:2015-03-23 14:04:12

标签: c# powershell cmdlets

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

为方便起见,我想允许此字段的制表符完成。但是,我似乎无法将其用于非const数据集。动态字段甚至不会自动填写字段名称,也不会隐藏价值,我也不知道如何为非动态字段实现此功能。从概念上讲,我可以在启动时根据当前数据集生成.ps1文件,然后加载ps1作为模块,但这感觉有点像用巨剑杀死一只小狗 - 很多过度杀伤力。有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

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

事实证明,它基于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类。需要一段时间才能找到,因为这个问题,我无法将错误写入控制台,所以我不得不追加到临时文件。