Powershell 邮件消息脚本

Powershell mail message script

我的脚本有问题。

每天晚上,服务器任务计划程序都会运行一个批处理程序,在无法更新的 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)

请帮忙。

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

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

它需要是(注意括号和 get-date 命令两边没有双引号):

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

PowerShell 有两种基本解析模式 - argument 模式 表达方式模式,以及理解什么时候应用很重要: 参见 Get-Help about_Parsing

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


或者,您可以使用带有 字符串插值 的单个双引号字符串,该字符串使用 子表达式运算符 $(...) , 嵌入 get-date 调用:

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

补充观察:

  • 本机 Send-MailMessage 从 PowerShell 版本 3 开始可用。

  • 2位数月份的格式字符串是MM,不是mm(后者是分钟)。

  • 虽然使用伪方法语法 new-object Net.Mail.MailMessage($from,$to,$subject,$body) 碰巧有效,但最好避免使用它,因为它可能掩盖对 New-Object 如何工作的误解:正确的形式是 New-Object Net.Mail.MailMessage -ArgumentList $from,$to,$subject,$body;如您所见,因为您正在处理 cmdlet,它使用 argument 模式。