Powershell邮件消息脚本

时间:2016-10-18 02:32:05

标签: email powershell send

我的脚本有问题。

每天晚上,服务器任务调度程序运行一个批处理,创建一个无法更新的PC的日志。然后,此PS脚本会提取错误日志并发送电子邮件通知我们PC。错误日志文件是.txt文件,文件名每天更改以反映日期,例如10172016.txt。

我可以将脚本发送到电子邮件,它用于拉取日志文件并将其放入其正文中;但现在,它是空白的并显示有关“+”的错误。

代码:

clear

$smtpserver = "test.test.org"

$from="noreply@test.org"

$to="adamh@test.org"

$subject="Update Error Log for" + " " + (get-date -format d)

$message = (Get-Content -path "\\testserver\Departments\IT\Private\test\logs" + "(get-date -f mmddyyyy)" + ".txt" | Out-String )

$mailer = new-object Net.Mail.SMTPclient($smtpserver)

$msg = new-object Net.Mail.MailMessage($from,$to,$subject,$body)

$msg.IsBodyHTML = $false

$mailer.send($msg)

请帮忙。

1 个答案:

答案 0 :(得分:0)

您的代码(至少)存在问题,即(命令简化):

Get-Content -path "\path\to\" + "(get-date -f MMddyyyy)" + ".txt"

它必须是(注意括号括号和get-date命令周围没有双引号):

Get-Content -path ("\path\to\" + (get-date -f MMddyyyy) + ".txt")

PowerShell具有两种基本解析模式 - 参数模式 表达式模式了解哪些是重要的: 见Get-Help about_Parsing

简而言之:如果没有(...),PowerShell会将"\path\to\" + (get-date -f MMddyyyy) + ".txt"视为 5个单独的参数,而不是单个合成字符串。

或者,您可以使用带有字符串插值的单个双引号字符串,使用子表达式运算符$(...) 来嵌入{{1}呼叫:

get-date

补充意见:

  • 自PowerShell版本3起,本机Send-MailMessage可用。

  • 2位数月份的格式字符串为Get-Content -path "\path\to\$(get-date -f MMddyyyy).txt" ,而不是MM(后者为分钟)。

  • 虽然使用伪方法语法mm恰好起作用,但最好避免它,因为它可以掩盖对new-object Net.Mail.MailMessage($from,$to,$subject,$body)如何工作的误解:正确的形式是{ {1}};正如您所看到的,因为您正在处理 cmdlet ,所以它使用参数模式。