我有一个简单的函数,它接收字符串电子邮件地址并使用[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
答案 0 :(得分:1)
我相信这是因为如果在数组开头找到有效的电子邮件地址,您的ValidateScript将返回true
。在你发布的最后一个脚本块中有
...
Process
{
$alias = $EmailAddresses
$alias += "NotASmtpAddress"
return $true
}
...
由于您在数组的开头添加了有效的电子邮件地址,因此验证脚本会通过。要解决此问题,您可以删除ValidateScript中的return $true
并使用bool变量来跟踪是否存在任何无效的电子邮件地址。然后在foreach循环之后使用if语句来return $true
或抛出异常。