PSCmdlet动态自动完成一个参数(如Get-Process)

时间:2014-09-13 13:57:26

标签: c# powershell pscmdlet

在powershell中,某些参数具有动态自动完成行为。 例如,Get-Process参数Name。我可以用TAB迭代我的所有进程。

Powershell auto complete parameter

我想在我的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

完成此操作的示例

有效 thx到@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;
}

1 个答案:

答案 0 :(得分:8)

来自MSDN:How to Declare Dynamic Parameters

您的Cmdlet课程必须实施IDynamicParameters界面。这个界面:

  

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

编辑:

IDynamicParameters.GetDynamicParameters()方法应该:

  

返回一个对象,该对象具有属性和字段,这些属性和字段具有与cmdlet类或RuntimeDefinedParameterDictionary对象中定义的属性类似的参数。

如果你看一下这个link,作者就是在PowerShell中这样做了。他在运行时创建:

  • 具有运行时可能值数组的ValidateSetAttribute的新实例
  • 然后,他创建了一个RuntimeDefinedParameter,并为其分配了ValidateSetAttribute
  • 他返回包含此参数的RuntimeDefinedParameterDictionary

你可以在C#中做同样的事情。您的GetDynamicParameters()方法应该返回包含相应RuntimeDefinedParameterDictionary。{/ p>的RuntimeDefinedParameter