2013-05-08 67 views
0

目前,我試圖用ValidateSet屬性聲明像這樣:如何獲取Powershell選項卡完成數組參數?

function cmdlet { 
    param(
     [Parameter(Mandatory = $True, Position = 0)] 
     [ValidateSet("option_1", "option_2", "option_3")] 
     [string[]] $options 
    ) 

    ... 
} 

利用這一點,我可以製表完成一個單位長度參數,即

> cmdlet <TAB> -> cmdlet option_1 

但要獲得進一步的選項對標籤完整(或者,實際上正確解析)我必須用引號括以前的參數,即

> cmdlet option_1<TAB> -> cmdlet option_1 

(沒有標籤完成)

> cmdlet "option_1",<TAB><TAB> -> cmdlet "option_1",option_2 

(正確執行)

> cmdlet option_1,option_2<ENTER> 
cmdlet : Cannot validate argument on parameter 'options'. The argument "o" does not belong to the set "option_1,option_2,option_3" specified by the ValidateSet attribute. 
Supply an argument that is in the set and then try the command again. 
At line:1 char:8 
+ cmdlet option_1,option_2 
+  ~~~~~~ 
    + CategoryInfo   : InvalidData: (:) [cmdlet], ParameterBindingValidationException 
    + FullyQualifiedErrorId : ParameterArgumentValidationError,cmdlet 

這顯然不太理想。要麼我希望tab完成將引用中的參數封裝起來(或者根本不要求它們,但我想這會更困難)。

非常感謝任何幫助。

+2

您不必將第一個參數換成引號,只需在第一次完成後添加逗號,然後再次按Tab鍵以添加更多值。無論引號如何,您的功能對我而言都毫無問題。不知道爲什麼「o」被傳遞。我會重新啓動控制檯並重試。 – 2013-05-08 12:49:12

回答

0

不太你想要什麼,但你可以使用ParameterSetName創建互斥開關的集合:

[CmdletBinding(DefaultParametersetName="Option_1")] 
param 
(
    [parameter(Mandatory=$true,ParameterSetName="Option_1")] 
    [switch]$Option_1, 

    [parameter(Mandatory=$true,ParameterSetName="Option_2")] 
    [switch]$Option_2, 

    [parameter(Mandatory=$true,ParameterSetName="Option_3")] 
    [switch]$Option_3 
) 

在我已經設置了默認Option_1的例子,但你可以省略這個讓所有其中可選的,如果你指定了多個,你會得到一個錯誤。

相關問題