2015-02-07 2 views
1

Я написал инструмент C#, где я могу вводить параметры скрипта с графическим интерфейсом, который создается на основе определений пармера сценария.Динамический список допустимых значений для сценария PowerShell

Теперь я хочу иметь раскрывающийся список, который предлагает мне динамически сгенерированный набор значений. Информация для этого раскрывающегося списка должна исходить из определения параметра скрипта.

(В моем случае я хочу, чтобы выбрать существующий AD OU Листинга всех дочерние объектов базового OU.)

Один из способов, чтобы получить список допустимых параметров является использование «ValidateSet» для определения параметров , Существует возможность получить из ValidateSet из сценария сборку выпадающего списка. Но ValidateSet является статическим дефинированием, и я должен обновлять скрипт каждый раз, когда список должен быть изменен.

Хорошим способом динамической проверки является «ValidateScript». Команда сценария будет похожа на Test-Path. Это будет работать для проверки, но для моего графического интерфейса я не смогу создать список допустимых значений.

Maby i может динамически генерировать пользовательский тип перечисления и использовать его в качестве типа параметра. Выпадающий список для типов перечислений уже реализован для графического интерфейса. Но я думаю, что я не очень хорошая идея и не могу работать, чтобы генерировать тип перечисления динамически.

Итак, любые другие идеи для списка допустимых значений, которые динамически построены?

ответ

0

Я попытался сделать это с перечислением один раз, и это стало проблематичным из-за различий в действительных наборах символов между значениями перечисления и именами AD.

Если вы хотите, чтобы GUI был отделен от скрипта, вы можете исследовать с помощью AST, чтобы извлечь код проверки параметров из сценария, а затем запустить его за пределами сценария для создания своего списка.

0

Dynamicparam хорошо работает для PowerShell.exe.

Но у меня есть проблемы с чтением ValidateSet с помощью программы C#.

Вот код я использую:

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>; 

В последней строке я получаю следующее исключение при попытке доступа к значению:

необработанное исключение «системы типа. Management.Automation.GetValueInvocationException 'произошли в System.Management.Automation.dll

Дополнительная информация: Исключение получения "Параметры": "Не удается получить динамические параметры для командлета. Трубопровод был остановлен.»

я получаю то же Exeption, когда я пытаюсь получить доступ к значению в окне VisualStudio Watch.

С помощью статической проверки ValidateSet код C# работает хорошо.

Смежные вопросы