当我们使用 Powershell 中的 Invoke-Command 命令手动触发另一个系统上的远程计划任务时遇到问题。
情况如下:服务器 XXX 有一个计划任务,运行 Powershell 脚本。在该脚本中,在某个时刻,它会触发以下代码行:Invoke-Command -Computer "SLMTL-WSUS01.XXX.inc" -ScriptBlock {schtasks /run /tn "Windows Update - Email Reporting"}
。调用的计划任务只是调用另一个 Powershell 脚本,该脚本从 HTML 文件获取内容,然后通过电子邮件发送。
问题出在这里:当通过命令调用计划任务时Invoke-Command
,任务的 Powershell 脚本会运行,但不发送电子邮件。如果我手动运行任务,它会正常工作并发送电子邮件。如果这很重要,两个计划任务都以 SYSTEM 身份运行。
我们之所以这样远程执行此操作,是因为我们不想允许多台服务器在内部发送电子邮件,而希望将其限制为一台服务器。
有人知道为什么会发生这种情况吗?
提前致谢!
编辑:这是格式正确的脚本:
$Content = Get-Content "\\slmtl-wsus01.XXX.inc\Update_Reports\*.html"
$messageParameters = @{
Subject = "Windows Update report - $((Get-Date).ToShortDateString())"
Body = $Content | Out-String
from = "[email protected]"
To = "[email protected]"
SmtpServer = "smtp.XXX.com"
}
Send-MailMessage @messageParameters -BodyAsHtml
答案1
您应该将您的命令包装在 try/catch 中以记录错误。
try {
Send-MailMessage ..... -ErrorAction Stop
}
catch {
AddContent $Error[0].Exception.Message -Path "C:\Log.txt"
}
ErrorAction Stop 将允许您捕获任何非终止错误。
答案2
我在尝试使用 Cory 的方法(由于某种原因,产生了零日志文件)解决问题时找到了这个问题。
在我的原始脚本中,运行后Invoke-Command -Computer "SLMTL-WSUS01.XXX.inc" -ScriptBlock {schtasks /run /tn "Windows Update - Email Reporting"}
,我得到了以下命令:Move-Item "\\slmtl-wsus01.XXX.inc\Update_Reports\*.html" "\\slmtl-wsus01.XXX.inc\Update_Reports\ARCHIVE"
在我的脑海中,该Invoke-Command .....
命令将等待实际的远程脚本终止,然后再继续执行 Move-Item 脚本……但它没有。因此,当我的主脚本移走文件夹的内容时,远程脚本正在尝试获取不再存在的所述内容,因此不会发送电子邮件。
再次,我的脚本编写能力因我的理解不足而受阻,一天的时间就浪费在这上面了:P