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



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

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

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

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

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

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

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

我曾经尝试过用枚举执行此操作,但由于枚举值和AD名称之间的有效字符集存在差异,因此出现了问题。

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

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

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

DynamicParam适用于PowerShell.exe。

但我在阅读带有C#程序的ValidateSet时遇到了问题。

这是我使用的代码:

InitialSessionState initial = InitialSessionState.CreateDefault();
initial.ImportPSModule(new string[] { @"C:UserskritzingerOneDriveTest-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>;

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

类型为的未处理异常中发生"System.Management.Automation.GetValueInvocationException"System.Management.Automation.dll

附加信息:获取"参数"时出现异常:"无法检索cmdlet的动态参数。管道已经停止。"

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

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

相关内容

  • 没有找到相关文章

最新更新