PowerShell ValidateSet失败--将变量设置为默认值的错误操作?

PowerShell ValidateSet失败--将变量设置为默认值的错误操作?,powershell,validateset,Powershell,Validateset,我正在使用一组必需的参数处理powershell函数。验证集工作得很好,但是正如验证集一样。。如果输入的选项不是列出的选项之一。。我将得到如下错误: function foo { param( [parameter(Mandatory=$true)] [ValidateSet('Test1','Test2','Test3')] [String]$ChooseOne= 'Test1', ) do xxxxxxxxxxxxxxxx

我正在使用一组必需的参数处理powershell函数。验证集工作得很好,但是正如验证集一样。。如果输入的选项不是列出的选项之一。。我将得到如下错误:

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

do xxxxxxxxxxxxxxxx
{

foo -ChooseOne Test9
有没有办法让错误操作将错误变量设置为先前定义的默认值?


因此,在本例中,它将默认值
$ChooseOne
为“
Test1

如果我将该值设置为非强制值,它将能够根据需要使用其默认值

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
在问题中,您显式地将无效参数传递给受约束的验证集
-选择一个
参数
,然后询问:

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

答案是:否,并且有一个很好的理由:如果您将参数定义为仅接受定义的可接受值集中的参数,则明确希望防止传递不可接受的值,因此希望PowerShell报告错误

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

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


在您自己的系统中,您将问题的前提更改为不向您的
传递任何值-选择一个
参数


使参数非强制性,即可选-这是默认值,顺便说一句,没有明确的
[参数(强制性=$false)]
needed-如果没有传递任何参数,确实会使为其声明的任何默认值生效-这正是默认值的要点。

有很多高级函数示例使用参数及其各种选项。示例:而且
[parameter(Mandatory=$false)]