2015-02-07 64 views
1

我已經編寫了一個C#工具,可以在該腳本參數中輸入基於腳本的參數定義生成的GUI。PowerShell腳本的有效值的動態列表

現在我想要一個下拉列表,它爲我提供了一組動態生成的值。這個下拉列表的信息應該來自腳本的參數定義。

(在我的情況,我想通過清單的基礎OU的所有子對象選擇現有的AD OU)

一種方式來獲得有效參數列表是使用「ValidateSet」的參數定義。從腳本獲得一個ValidateSet並建立下拉列表。但是ValidateSet是一個靜態定義,每次更改列表時我都必須更新腳本。

動態驗證的一個好方法是「ValidateScript」。腳本命令將會像Test-Path一樣。這將用於驗證,但對於我的GUI,我將無法生成有效值列表。

Maby我可以動態生成一個自定義的枚舉類型,並將其用作參數類型。 GUI中已經實現了枚舉類型的下拉列表。 但我認爲我不是一個好主意,可能無法動態生成枚舉類型。

那麼,對於動態構建的有效值列表的任何其他想法?

回答

0

我試着用enum做過一次,並且由於枚舉值和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>; 

在最後一行我得到下面的異常當我嘗試訪問Value:

型 「系統的未處理的異常。 Management.Automation.GetValueInvocationException'發生在 System.Management.Automation.dll

其他信息:獲取「Parameters」的異常:「Can not 檢索該cmdlet的動態參數。該流水線已被 停止。「

當我嘗試訪問VisualStudio Watch窗口中的值時,獲得相同的Exeption。

使用靜態ValidateSet定義c#代碼運行良好。