3

在 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;
}
4

1 回答 1

9

来自 MSDN:如何声明动态参数

你的Cmdlet类必须实现IDynamicParameters接口。这个界面:

为 cmdlet 提供一种机制来检索可由 Windows PowerShell 运行时动态添加的参数。

编辑:

IDynamicParameters.GetDynamicParameters()方法应:

返回一个对象,该对象的属性和字段与参数相关的属性类似于在 cmdlet 类或 RuntimeDefinedParameterDictionary 对象中定义的属性。

如果您查看此链接,则作者正在 PowerShell 中执行此操作。他在运行时创建:

  • 具有可能值ValidateSetAttribute运行时数组的新实例
  • 然后他创建了一个RuntimeDefinedParameter他指定的ValidateSetAttribute
  • 他返回一个RuntimeDefinedParameterDictionary包含这个参数的

您可以在 C# 中执行相同的操作。您的GetDynamicParameters()方法应该返回RuntimeDefinedParameterDictionary包含适当的RuntimeDefinedParameter.

于 2014-09-13T15:34:44.683 回答