我编写了一个脚本,用于从多个服务器收集日志,然后将其拉上并通过电子邮件发送。由于这些电子邮件的收件人可能因情况而异,我选择使用用户输入而不是硬编码电子邮件地址。这就是我所拥有的:
$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"
我做错了什么?
答案 0 :(得分:0)
问题在于这一行:
$to = '"' + (read-host -prompt "Send to") + '"'
您正在字符串中添加文字双引号"
。
$to = read-host -prompt "Send to"
这就是你所需要的一切。
当您在代码中使用带引号的字符串时,引号会告诉解析器它是一个字符串;它们不是内容的一部分。
因此,在使用文字指定参数时,您可能需要引号(同样适用于解析器):
-To 'Some@address.com'
但是当你使用变量时,变量不应该包含那些引号。
答案 1 :(得分:0)
"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')