PowerShell脚本的有效值的动态列表

时间:2015-02-07 22:50:24

标签: c# powershell validateset

我编写了一个C#工具,我可以使用GUI输入脚本参数,该GUI是根据脚本的参数定义生成的。

现在我想要一个下拉列表,它为我提供了一组动态生成的值。此下拉列表的信息应来自脚本的参数定义。

(在我的情况下,我想通过列出基本OU的所有子对象来选择现有的AD OU。)

获取有效参数列表的一种方法是使用" ValidateSet"用于参数定义。从脚本中获取有效的ValidateSet并构建下拉列表。但ValidateSet是一个静态deffinition,我必须在每次更改列表时更新脚本。

动态验证的一个好方法是" ValidateScript"。脚本命令类似于Test-Path。这可用于验证,但对于我的GUI,我将无法生成有效值列表。

Maby我可以动态生成自定义枚举类型并将其用作参数类型。已经为GUI实现了枚举类型的下拉列表。 但我认为我不是一个好主意,可能无法动态生成枚举类型。

那么,对于动态构建的有效值列表还有其他任何想法吗?

3 个答案:

答案 0 :(得分:0)

我尝试用enum做过一次,由于枚举值和AD名称之间的有效字符集不同而导致问题。

如果您希望将GUI与脚本分开,您可以调查使用AST从脚本中提取参数验证代码,然后在脚本外部运行它以构建列表。

答案 1 :(得分:0)

您可以在Powershell脚本中使用动态参数。 可以在此处找到从scriptblock动态生成并添加到动态参数的ValidateSet参数属性的一个很好的示例:

http://blogs.technet.com/b/pstips/archive/2014/06/10/dynamic-validateset-in-a-dynamic-parameter.aspx

答案 2 :(得分:0)

DynamicParam适用于PowerShell.exe。

但我有问题用C#程序读取ValidateSet。

以下是我使用的代码:

InitialSessionState initial = InitialSessionState.CreateDefault();
initial.ImportPSModule(new string[] { @"C:\Users\kritzinger\OneDrive\Test-DynamicValidateSet.psm1" });
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();

PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
ps.Commands.AddCommand("Get-Command").AddArgument("Test-DynamicValidateSet").AddParameter("ArgumentList", "Path");
Collection<PSObject> get_Command = ps.Invoke();
PSObject command = get_Command[0];
Dictionary<String, ParameterMetadata> parameters = command.Properties["parameters"].Value as Dictionary<String, ParameterMetadata>;

在最后一行,当我尝试访问Value时,我得到以下异常:

  

未处理的类型异常   &#39; System.Management.Automation.GetValueInvocationException&#39;发生在   System.Management.Automation.dll

     

附加信息:异常获取&#34;参数&#34;:&#34;不能   检索cmdlet的动态参数。管道已经   停止&#34;

当我尝试访问VisualStudio Watch窗口中的值时,我得到了相同的Exeption。

使用静态ValidateSet定义,c#代码运行良好。