如何循环服务器列表以查看过去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}
}
它无法正常工作,我在哪里做错了?
答案 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