Powershell搜索事件ID并发送电子邮件

时间:2017-08-22 14:00:46

标签: powershell

如何循环服务器列表以查看过去10分钟内是否有事件ID,然后发送电子邮件。我无法弄清楚“foreach”+“if”+“output”

$serverlist = get-content "c:\serverlist.txt"
Foreach ($server in $serverlist) {
  Get-Eventlog -LogName System -EntryType Error -after (get-date).AddMinutes(-20) 
     if ($_.EventID -eq 7036)
          {send email}
}

它无法正常工作,我在哪里做错了?

2 个答案:

答案 0 :(得分:1)

A)(获取内容)从服务器列表中获取服务器列表

B)(Foreach)遍历列表中的每个服务器

C)使用条目从服务器列表中的计算机名称输入事件类型“错误”。错误事件ID等于7036

D)如果错误大于0则发送所有错误列表

| V1|    V2|
|--:|-----:|
|  1| 21,21|
|  2| 31,23|

答案 1 :(得分:0)

您的方法不起作用的原因

  • 您的日志结果集和if语句无法连接。您将所有记录返回标准输出。你的if有效地检查$ null是否等于7036,这永远不会是真的。
  • $_是一个空的管道对象,因为您使用变量$server来表示它。
  • 您甚至没有查看远程计算机,因为您没有指定-ComputerName

您可以将所有条件过滤到cmdlet本身。无需后期处理,这将使其运行更快。

Get-Eventlog -LogName System -EntryType Error -after (Get-Date).AddMinutes(-20) -ID 7036 -ComputerName $server

因此,如果您将其捕获到变量中,则可以更改if

$results = Get-Eventlog ....
if($results){"send mail"}

但是我会考虑收集所有结果并发送一封邮件。

$computersWithEvents = Get-Content $path | 
    Where-Object{Get-Eventlog -LogName System -EntryType Error -after (Get-Date).AddMinutes(-10) -ID 7036 -ComputerName $_}

这种方式$computersWithEvents包含所有在过去10分钟内发生7036事件的服务器。您现在可以通过一封邮件发送。

您也可以尝试使用Get-WinEvent,这应该很容易换掉你拥有的东西。它可以说比Get-WinEvent

相关问题