PowerShell:get-eventlog需要很长时间才能完成

时间:2013-09-26 00:24:26

标签: powershell

我正在尝试编写远程服务器上过去30天应用程序和系统事件日志的审核脚本,仅查找警告,错误或关键条目。

借鉴我在此处和其他论坛中发现的内容,我想出了:

$Date = Get-Date
$Range = $Date.AddDays(-30)
$Range = $range.ToShortDateString();
$LogName = Read-Host "Which Log? (Application, System)"
$Server = Read-Host "Please Enter Server Name"

get-eventlog $LogName -ComputerName $Server -After $range | where {$_.EntryType -eq "Error" -or $_.EntryType -eq "Warning" -or $_.EntryType -eq  "Critical"}

这似乎运行得相当快,但是在返回提示之前会挂起几(5-10 +)分钟,如果确实如此....

注意:如果我删除代码:

-After $range

我可以简单地用ctrl-c打破输出并继续我的一天,但我宁愿按预期运行然后停止......

所以:关于如何消除这种情况的任何想法都挂了? 我也对如何使代码更优雅(更快)的想法持开放态度! 而且我不介意脚本检查应用程序和系统日志而不必运行两次....

2 个答案:

答案 0 :(得分:2)

使用-EntryType上的Get-EventLog字符串数组参数比检索整个事件日志然后使用Where-Object

过滤要快得多

尝试get-eventlog -Logname System -EntryType ("Error", "Warning")

但是......如果我在-EntryType数组中加上“Critical”,我会得到:The argument "Critical" does not belong to the set "Error,Information,FailureAudit,SuccessAudit,Warning" specified by the ValidateSet attribute.这让我想知道你是否应该听从Get-Help Get-EventLog中列出的建议:

  

包含EventLog名词(EventLog cmdlet)的cmdlet可以正常工作   仅适用于经典事件日志。从使用该日志的日志中获取事件   Windows Vista及更高版本的Windows事件日志技术   Windows,使用Get-WinEvent。

使用Get-WinEvent代替,我认为这就是你想要的: Get-Winevent -FilterHashtable @{LogName="System","Application"; Level=1,2,3; startTime=$range}

这将检查级别1,2或3(分别为严重,错误,警告)的事件,并在同一调用中搜索应用程序和系统日志。

答案 1 :(得分:2)

我发现,对于远程系统,如果我将它包装到Invoke-Command中,我可以使用相同的命令一次查询多个系统。这是我的解决方案。系统越多,节省的时间就越多。 YMMV

$command = {Get-EventLog -LogName Application -After (Get-Date).AddHours("-24")}
Invoke-Command -ComputerName "foo1","foo2","foo3","foo4" -ScriptBlock $command