1

現在、ValidateSet 属性宣言を次のように使用しようとしています。

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

これは明らかに理想的ではありません。タブ補完で引数を引用符で囲みたいと思います(または、それらをまったく必要としないようにしますが、それは難しいと思います)。

どんな援助も大歓迎です。

4

1 に答える 1

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 に設定していますが、これを省略してすべてをオプションにすることもできます。複数指定するとエラーが発生します。

于 2013-05-08T12:51:18.520 に答える