Как я могу предоставить список завершения вкладок со значениями, сгенерированными при запуске powershell?

Итак, у меня есть командлет, написанный на С#: Get-LivingCharacter. Я хочу, чтобы пользователи использовали это как Get-LivingCharacter -Name "Bran", но я хотел бы разрешить изменение списка доступных символов. Может быть, сегодня «Бран» — правильное имя для Get-LivingCharacter, но, возможно, в будущем это будет не так. Всякое случается.

Для удобства я хочу разрешить табуляцию этого поля. Однако я не могу заставить это работать для неконстантных наборов данных. Динамические поля даже не заполняют автоматически имя поля, не говоря уже о значении, и я не знаю, как реализовать это для нединамического поля. Концептуально я мог бы сгенерировать файл .ps1 при запуске с текущим набором данных, а затем загрузить этот ps1 в качестве модуля, но это немного похоже на убийство щенка двуручным мечом — много излишеств. Есть ли лучший вариант?


person Rollie    schedule 23.03.2015    source источник
comment
Взгляните на эту статью (Dynamic ValidateSet в динамическом параметре): blogs.technet.com/b/pstips/archive/2014/06/10/   -  person Martin Brandl    schedule 23.03.2015
comment
Рассматривали ли вы использование Enum? Вы можете создать собственное перечисление из списка вне функции, а затем указать параметр как этот тип перечисления внутри функции, и вы получите завершение табуляции и сможете манипулировать списком вне функции.   -  person mjolinor    schedule 23.03.2015
comment
Как определить, что такое набор живых символов? Где хранятся эти данные?   -  person Matt    schedule 23.03.2015
comment
Я знал, что видел что-то вроде этого вопроса раньше. Ознакомьтесь с этим SO-вопросом для отличной статьи Cookie Monster (с большой реквизит к мьолинор для энума советую и там). ОП, возможно, принял мой ответ, но даже я проголосовал за усилия Куки.   -  person TheMadTechnician    schedule 24.03.2015


Ответы (1)


Я уже реализовал аналогичную функцию для вспомогательной функции DynamicParam, как указано в комментарии. Однако завершение табуляции не работало. Я писал пример минимального воспроизведения, когда... мое завершение табуляции сработало.

Оказывается, он воспроизводимо работает/ломается на основе включения оператора 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 после того, как я закончу команду для проверки. Потребовалось некоторое время, чтобы найти, так как из-за проблемы я не могу записать ошибку в консоль, поэтому вместо этого мне пришлось добавить ее во временный файл.

person Rollie    schedule 24.03.2015