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 模式。
我的脚本有问题。
每天晚上,服务器任务计划程序都会运行一个批处理程序,在无法更新的 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 模式。