2016-06-17 17 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アドレスをスクリプト本体に追加することができます。 [$($ _内の$アドレス){ if(![bool]($アドレス-as [System.Net.Mail.MailAddress])){ throw "$($ _)is an無効なメールアドレス " } } 返品$ true })] –

+0

素晴らしい!私はあなたのために働いてうれしいです。 – Sync

関連する問題