我有这个简单的脚本:
param([string[]]$to="markk", $subject=$null, $body=$null, $from="name", $suffix="@example.com", $server="dev-builder")
function NormalizeAddress([string]$address)
{
if ($address -notmatch "@")
{
$address = $address + $suffix
}
$address
}
if (! $subject)
{
$subject = [DateTime]::Now
}
$from = NormalizeAddress $from
$to = $to | % { NormalizeAddress $_ }
Send-MailMessage -To $to -Subject $subject -From $from -Body $body -SmtpServer $server
Run Code Online (Sandbox Code Playgroud)
它以这样的方式编写,以便可以在没有任何参数的情况下运行它,在这种情况下,测试消息将被发送给作者(我).
目前,该脚本失败,因为传递$null的-Body参数是不允许的:
Send-MailMessage : Impossible de valider l'argument sur le paramètre « Body ». L'argument est null ou vide. Indiquez un argument qui n'est pas null ou vide et réessayez.
Au niveau de C:\Work\hg\utils\SendEmail.ps1 : 19 Caractère : 61
+ Send-MailMessage -To $to -Subject $subject -From $from -Body <<<< $body -SmtpServer $server
+ CategoryInfo : InvalidData: (:) [Send-MailMessage], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SendMailMessage
Run Code Online (Sandbox Code Playgroud)
我有三种可能的解决方案:
Send-MailMessage命令语句:if ($body)
{
Send-MailMessage -To $to -Subject $subject -From $from -Body $body -SmtpServer $server
}
else
{
Send-MailMessage -To $to -Subject $subject -From $from -SmtpServer $server
}
Run Code Online (Sandbox Code Playgroud)
Invoke-Expression:$expr = "Send-MailMessage -To `"$to`" -Subject `"$subject`" -From `"$from`" -SmtpServer `"$server`""
if ($body)
{
$expr = "$expr -Body `"$body`""
}
Invoke-Expression $expr
Run Code Online (Sandbox Code Playgroud)
if (! $body)
{
$body = " "
}
Send-MailMessage -To $to -Subject $subject -From $from -Body $body -SmtpServer $server
Run Code Online (Sandbox Code Playgroud)
所有这些解决方案对我来说都很糟糕,因为它们都有这种气味.我必须在这里遗漏一些非常基本的东西,所以我的问题是如何在不必诉诸这些黑客的情况下通过空体?
谢谢.
该Send-MailMessagecmdlet将可以发送电子邮件,而无需指定身体参数.另一方面,如果确实指定了值,则它不能为空或为null(参数上有验证属性,ValidateNotNullOrEmpty).因此,解决方案是创建参数名称和值的哈希表(也称为splatting)并将其传递给底层cmdlet:
param([string[]]$to="markk", $subject=$null, $body=$null, $from="name", $suffix="@example.com", $server="dev-builder")
function NormalizeAddress([string]$address)
{
if ($address -notmatch "@")
{
$address = $address + $suffix
}
$address
}
if (! $subject)
{
$subject = [DateTime]::Now
}
$param = @{
from=NormalizeAddress $from
to = $to | foreach { NormalizeAddress $_ }
subject = $subject
smtpserver = $server
}
# if body is not empty or null - add it to the hastable
if( ![String]::IsNullOrEmpty($body) ) {$param['body']=$body}
Send-MailMessage @param
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3417 次 |
| 最近记录: |