Powershell: как передать пустое тело в Send-MailMessage? - PullRequest
4 голосов
/ 07 ноября 2011

У меня есть этот простой скрипт:

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

Он написан таким образом, что его можно запустить без каких-либо аргументов, и в этом случае тестовое сообщение будет отправлено автору (мне).

В настоящее время сценарий завершается ошибкой, поскольку передача $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

У меня есть три возможных решения:

  • Два 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

Все эти решения выглядят плохо для меня, потому что все они пахнут просто взломами. Я, должно быть, здесь упускаю что-то действительно простое, поэтому мой вопрос в том, как я могу пропустить пустое тело, не прибегая к этим взломам?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 07 ноября 2011

Командлет Send-MailMessage может отправлять электронные письма без указания параметра Body. С другой стороны, если вы укажете значение, оно не должно быть пустым или нулевым (в параметре есть атрибут валидации ValidateNotNullOrEmpty). Таким образом, решение будет состоять в том, чтобы создать хеш-таблицу с именами и значениями параметров (также известными как splatting) и передать ее в базовый командлет:

 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 голосов
/ 07 ноября 2011

Вы можете использовать переменную "splat" для косвенной передачи параметров:

$extraParams = @{}
if (-not [String]::IsNullOrEmpty($body)) {
  $extraParams['Body'] = $body
}

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

Обратите внимание на использование @ для передачи хеш-таблицы пар имя-параметр-параметр-значение (вы, конечно, можете передать все параметры таким образом, например, при инициализации $extraParams).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...