2016-06-17 39 views
1

我有一個簡單的函數,它接收字符串電子郵件地址並使用[System.Net.Mail.MailAddress]驗證它們。如果我嘗試將不符合ValidateScript的數據添加到函數體中的$ EmailAddress變量,它將拋出錯誤,如再次觸發ValidateScript。爲什麼PowerShell再次觸發參數驗證?

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 [email protected] 

當我嘗試添加不符合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 += "[email protected]" 
     return $true 
    } 
    End 
    { 
    } 
} 

回來沒事。

Set-EmailAddresses -EmailAddresses [email protected] 
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 [email protected] 
True 

回答

1

我相信這是因爲你的ValidateScript將返回true如果它在數組的開頭找到一個有效的電子郵件地址。在最後一個腳本塊,你發佈你有

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

既然你加入一個有效的電子郵件地址數組的開始,驗證腳本傳遞。要解決此問題,您可以刪除ValidateScript中的return $true並使用bool變量來跟蹤是否有任何無效的電子郵件地址。然後在foreach循環之後使用if語句來return $true或拋出異常。

+0

是的,就是這樣,我將驗證更改爲以下,現在我可以在腳本主體中添加無效的SMTP地址。如果(![bool]($ address -as [System.Net.Mail.MailAddress])){ throw「$($ _)是一個$($ _)是一個$ {$ _ $}無效的電子郵件地址。「 } } return $ true })] –

+0

太棒了!我很高興它爲你工作。 – Sync

相關問題