我编写了一个C#工具,我可以使用GUI输入脚本参数,该GUI是根据脚本的参数定义生成的。
现在我想要一个下拉列表,它为我提供了一组动态生成的值。此下拉列表的信息应来自脚本的参数定义。
(在我的情况下,我想通过列出基本OU的所有子对象来选择现有的AD OU。)
获取有效参数列表的一种方法是使用" ValidateSet"用于参数定义。从脚本中获取有效的ValidateSet并构建下拉列表。但ValidateSet是一个静态deffinition,我必须在每次更改列表时更新脚本。
动态验证的一个好方法是" ValidateScript"。脚本命令类似于Test-Path。这可用于验证,但对于我的GUI,我将无法生成有效值列表。
Maby我可以动态生成自定义枚举类型并将其用作参数类型。已经为GUI实现了枚举类型的下拉列表。 但我认为我不是一个好主意,可能无法动态生成枚举类型。
那么,对于动态构建的有效值列表还有其他任何想法吗?
答案 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#代码运行良好。