Powershell:如何将空主体传递给Send-MailMessage?

4

I have this simple script:

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

这样编写的目的是为了让用户无需任何参数即可运行它,这种情况下会向作者(我)发送一条测试消息。

当前脚本失败了,因为在-Body参数中传递$null是不允许的:

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

我有三种可能的解决方案:
  • 两个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
}
  • 使用Invoke-Expression

$expr = "Send-MailMessage -To `"$to`" -Subject `"$subject`" -From `"$from`" -SmtpServer `"$server`""
if ($body)
{
  $expr = "$expr -Body `"$body`""
}

Invoke-Expression $expr
  • 使用单个空格字符模拟空消息体:

if (! $body)
{
  $body = " "
}
Send-MailMessage -To $to -Subject $subject -From $from -Body $body -SmtpServer $server

所有这些解决方案在我看来都很糟糕,因为它们都带有一种仅仅是hack的味道。我一定漏掉了一些非常基本的东西,所以我的问题是,如何在不使用这些hack的情况下传递空body?

谢谢。

2个回答

5

Send-MailMessage 命令可以在不指定 Body 参数的情况下发送电子邮件。但是,如果您指定了一个值,则该值不能为 empty 或 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

4
您可以使用“星号”变量间接传递参数:
$extraParams = @{}
if (-not [String]::IsNullOrEmpty($body)) {
  $extraParams['Body'] = $body
}

Send-MailMessage -To $to -Subject $subject -From $from -SmtpServer $server @extraParams

注意使用@来传递参数名和参数值对的哈希表(当然,您也可以通过这种方式传递所有参数,例如在$extraParams的初始化中)。


如果IsNullOrEmpty的值为true,您不想添加“Body” :) - Shay Levy
@ShayLevy 我知道我写那个的时候是在考虑-not,但显然计算机没明白 :-) 我来修复一下。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接