如何在send-mailmessage的-To参数中使用read-host变量

时间:2016-11-07 15:38:47

标签: powershell

我编写了一个脚本,用于从多个服务器收集日志,然后将其拉上并通过电子邮件发送。由于这些电子邮件的收件人可能因情况而异,我选择使用用户输入而不是硬编码电子邮件地址。这就是我所拥有的:

$to = '"' + (read-host -prompt "Send to") + '"'
do {
Write-host "Add another recipient?"
$choice = read-host -prompt "[y/n]"
switch ($choice) {
'y'{
$add = ',"' + (read-host -prompt "Send to") + '"'
$to = -Join ($to, $add)
}
}
}
until ($choice -eq 'n')
$issuenum = read-host -prompt "Issue Number (enter if none)"
$title = read-host -prompt "Email Title"
$body = read-host -prompt "Message"
Send-MailMessage -To $to -From "test@testemail.com" -SMTPServer smtpserver.com -Subject "[$issuenum] $title" -body $body -attachments $attachments
}

但是,运行脚本时出现以下错误:

Send-MailMessage : An invalid character was found in the mail header: '"'.
At C:\PATH\SCRIPT.ps1:431 char:1
+ Send-MailMessage -To $to -From "test@testemail.com" -SMTPServer  ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidType: (:) [Send-MailMessage], FormatException
+ FullyQualifiedErrorId : FormatException,Microsoft.PowerShell.Commands.SendMailMessage

Send-MailMessage : A recipient must be specified.
At C:\PATH\SCRIPT.ps1:431 char:1
+ Send-MailMessage -To $to -From "test@testemail.com" -SMTPServer  ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], InvalidOperationException
+ FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.SendMailMessage 

当我将$ $的值显示给变量时,它会输出我期望看到的内容:send-mailmessage -to参数的正确格式。

"test1@testemail.com","test2@testemail.com"

我做错了什么?

2 个答案:

答案 0 :(得分:0)

问题在于这一行:

$to = '"' + (read-host -prompt "Send to") + '"'

您正在字符串中添加文字双引号"

$to = read-host -prompt "Send to"

这就是你所需要的一切。

当您在代码中使用带引号的字符串时,引号会告诉解析器它是一个字符串;它们不是内容的一部分。

因此,在使用文字指定参数时,您可能需要引号(同样适用于解析器):

-To 'Some@address.com'

但是当你使用变量时,变量不应该包含那些引号。

答案 1 :(得分:0)

输入PowerShell的

"a","b"是一个包含2个文字字符串的数组,不包含引号和逗号。

在代码中计算的

"a","b"是包含四个引号和逗号的1个字符串。

Send-MailMessage旨在与前者合作。

尝试将$to放入字符串数组中:

$to = @(read-host -prompt "Send to")
do {
    Write-host "Add another recipient?"
    $choice = read-host -prompt "[y/n]"
    switch ($choice) {
       'y'{
            $to += (read-host -prompt "Send to")
        }
    }
}
until ($choice -eq 'n')