0
function foo
{
    param(
        [parameter(Mandatory=$true)]
        [ValidateSet('Test1','Test2','Test3')] 
        [String]$ChooseOne= 'Test1',
    )

do xxxxxxxxxxxxxxxx
{

foo -ChooseOne Test9

我正在使用一组必需参数来开发一个 powershell 函数。验证集效果很好,但是验证集是..如果输入的选项不是列出的选项之一..我会收到如下错误:

foo: Cannot validate argument on parameter 'ChooseOne'. The argument "Test9" does not belong to the set "Test1,Test2,Test3" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the 
command again.
At line:1 char:1
+ foo
+ ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [foo], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,foo

有没有办法让错误操作将错误的变量设置为之前定义的默认值?

所以在这种情况下,它将默认$ChooseOne为“ Test1

4

2 回答 2

0

在您的问题中 ,您明确地将无效参数传递给您的验证集约束-ChooseOne参数,然后询问:

有没有办法通过错误操作将错误的变量设置为之前定义的默认值?

答案是:不,并且有充分的理由:如果您将参数定义为仅接受来自已定义的一组可接受值的参数,则您明确希望防止传递不可接受的值,因此您希望PowerShell 报告错误。

如果你想接受无效值但悄悄地忽略它们——这似乎是个坏主意——不要在参数上使用验证属性,而是在你的函数中处理验证——并安静地恢复为默认值。

顺便说一句:为标记为强制的参数定义默认值是没有意义的。


在您自己的答案中,您将问题的前提更改不将任何传递给您的-ChooseOne参数。

使参数不是强制性的,即可的 - 这是默认值,因此不需要显式[parameter(Mandatory=$false)]- 如果没有传递参数,则确实使为其声明的任何默认值生效。

于 2017-02-20T03:20:31.623 回答
-1

如果我使该值不是强制性的,它将能够根据需要使用其默认值。

[parameter(Mandatory=$false)]
于 2017-02-19T20:27:52.120 回答