PSCmdlet динамическое автоматическое завершение параметра (например, Get-Process)

В powershell некоторые параметры имеют динамическое автозаполнение. Например, Get-Process имя параметра. Я могу перебирать все свои процессы с помощью TAB.

Параметр автоматического завершения Powershell

Я хочу использовать это поведение в своем PSCmdlet.

Но проблема в том, что я знаю, как это сделать только со статическим значением автозаполнения. См. пример:

public class TableDynamicParameters
{
    [Parameter]
    [ValidateSet("Table1", "Table2")]
    public string[] Tables { get; set; }
}

Вот пример того, как это делается с помощью родной оболочки powershell http://blogs.technet.com/b/heyscriptingguy/archive/2014/03/21/use-dynamic-parameters-to-populate-list-of-printer-names.aspx


Это работает спасибо @bouvierr

public string[] Tables { get; set; }

public object GetDynamicParameters()
{
    if (!File.Exists(Path)) return null;

    var tableNames = new List<string>();
    if (TablesCache.ContainsKey(Path))
    {
        tableNames = TablesCache[Path];
    }
    else
    {
        try
        {
            tableNames = DbContext.GetTableNamesContent(Path);
            tableNames.Add("All");
            TablesCache.Add(Path, tableNames);
        }
        catch (Exception e){}
    }

    var runtimeDefinedParameterDictionary = new RuntimeDefinedParameterDictionary();
    runtimeDefinedParameterDictionary.Add("Tables", new RuntimeDefinedParameter("Tables", typeof(String), new Collection<Attribute>() { new ParameterAttribute(), new ValidateSetAttribute(tableNames.ToArray()) }));

    return runtimeDefinedParameterDictionary;
}

person hdev    schedule 13.09.2014    source источник


Ответы (1)


Из MSDN: Как объявить Динамические параметры

Ваш класс Cmdlet должен реализовывать интерфейс IDynamicParameters. Этот интерфейс:

Предоставляет механизм получения командлетом параметров, которые могут динамически добавляться средой выполнения Windows PowerShell.

РЕДАКТИРОВАТЬ:

Метод IDynamicParameters.GetDynamicParameters() должен:

вернуть объект со свойствами и полями с атрибутами, связанными с параметрами, аналогичными тем, которые определены в классе командлета или объекте RuntimeDefinedParameterDictionary.

Если вы посмотрите на эту ссылку, автор делает это в PowerShell. Он создает во время выполнения:

  • новый экземпляр ValidateSetAttribute с массивом возможных значений среды выполнения
  • Затем он создает RuntimeDefinedParameter, которому назначает ValidateSetAttribute
  • Он возвращает RuntimeDefinedParameterDictionary, содержащий этот параметр

Вы можете сделать то же самое в C#. Ваш метод GetDynamicParameters() должен возвращать этот RuntimeDefinedParameterDictionary, содержащий соответствующий RuntimeDefinedParameter.

person bouvierr    schedule 13.09.2014
comment
Это позволит добавить второй параметр в случае указания другого. Я не понимаю, как это отвечает на вопрос ОП о динамическом определении потенциального значения параметра. - person Matt; 13.09.2014
comment
@Matt, я уточнил свой ответ. ссылка, которую я разместил, показывает технику. Это есть в PS, но это всего лишь объекты .NET, так что вы можете сделать то же самое в C#, в методе GetDynamicParameters(). - person bouvierr; 13.09.2014
comment
здесь ссылка на другой пост SO для того же самого. содержит ссылку «Сценаристы» для того же решения. - person Matt; 13.09.2014