为什么PowerShell会再次触发参数验证?

时间:2016-06-17 17:19:08

标签: .net validation powershell

我有一个简单的函数,它接收字符串电子邮件地址并使用[System.Net.Mail.MailAddress]验证它们。如果我尝试将不符合ValidateScript的数据添加到函数体中的$ EmailAddress变量,它将抛出错误,例如再次触发ValidateScript。

    function Set-EmailAddresses
{
    [CmdletBinding()]
    [Alias()]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)]
        [ValidateScript({
            foreach ($address in $_) {
                if ([bool]($address -as [System.Net.Mail.MailAddress])) {
                    return $true
                }
                else {
                    throw "Invalid email address(es)."
                }
            }
        })]
        [string[]]
        $EmailAddresses
    )

    Begin
    {
    }
    Process
    {
        $EmailAddresses += "NotASMTPAddress"
        return $true
    }
    End
    {
    }
}

执行功能,提供有效的电子邮件地址。

Set-EmailAddresses -EmailAddresses test@test.net

当我尝试添加不符合ValidateScript的数据时抛出错误。

Invalid email address(es).
At line:15 char:21
+                     throw "Invalid email address(es)."
+                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (Invalid email address(es).:String) [], RuntimeException
    + FullyQualifiedErrorId : Invalid email address(es).

如果我更改主体以传递ValidateScript,它就可以工作。

function Set-EmailAddresses
{
    [CmdletBinding()]
    [Alias()]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)]
        [ValidateScript({
            foreach ($address in $_) {
                if ([bool]($address -as [System.Net.Mail.MailAddress])) {
                    return $true
                }
                else {
                    throw "Invalid email address(es)."
                }
            }
        })]
        [string[]]
        $EmailAddresses
    )

    Begin
    {
    }
    Process
    {
        $EmailAddresses += "anothersmtp@test.net"
        return $true
    }
    End
    {
    }
}

很好。

Set-EmailAddresses -EmailAddresses test@test.net
True

这也很好。

function Set-EmailAddresses
{
    [CmdletBinding()]
    [Alias()]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=1)]
        [ValidateScript({
            foreach ($address in $_) {
                if ([bool]($address -as [System.Net.Mail.MailAddress])) {
                    return $true
                }
                else {
                    throw "Invalid email address(es)."
                }
            }
        })]
        [string[]]
        $EmailAddresses
    )

    Begin
    {
    }
    Process
    {
        $alias = $EmailAddresses
        $alias += "NotASmtpAddress"
        return $true
    }
    End
    {
    }
}

没有抛出任何错误。

Set-EmailAddresses -EmailAddresses test@test.net
True

1 个答案:

答案 0 :(得分:1)

我相信这是因为如果在数组开头找到有效的电子邮件地址,您的ValidateScript将返回true。在你发布的最后一个脚本块中有

...
Process
    {
        $alias = $EmailAddresses
        $alias += "NotASmtpAddress"
        return $true
    }
...

由于您在数组的开头添加了有效的电子邮件地址,因此验证脚本会通过。要解决此问题,您可以删除ValidateScript中的return $true并使用bool变量来跟踪是否存在任何无效的电子邮件地址。然后在foreach循环之后使用if语句来return $true或抛出异常。