我的脚本有问题。
每天晚上,服务器任务调度程序运行一个批处理,创建一个无法更新的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)
请帮忙。
答案 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 ,所以它使用参数模式。