gpt4 book ai didi

Powershell:如何将空正文传递给 Send-MailMessage?

转载 作者:行者123 更新时间:2023-12-03 09:35:28 26 4
gpt4 key购买 nike

我有这个简单的脚本:

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

    所有这些解决方案在我看来都很糟糕,因为它们都有一种被黑客攻击的味道。我一定在这里遗漏了一些非常基本的东西,所以我的问题是我怎样才能通过空的 body 而不必求助于这些黑客?

    谢谢。

    最佳答案

    Send-MailMessage cmdlet 可以在不指定 Body 参数的情况下发送电子邮件。另一方面,如果您确实指定了一个值,则它不能为空或 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

    关于Powershell:如何将空正文传递给 Send-MailMessage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8035848/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com