我的脚本运行时间太长

时间:2013-12-17 20:28:20

标签: powershell powershell-v2.0 event-log powershell-v3.0

我的脚本会在24小时内报告应用程序,系统和安全日志中的事件错误。该脚本平均需要8分钟才能运行。我相信这些特定的陈述会导致这个问题:

$Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24)
$Lap | where {$_.entryType -match "Error"} | Sort-Object eventid |
  group-object eventid | Format-Table Name, Count -auto | fl |
  out-string | Add-Content $eventlogfile

如果我将-after参数替换为-newest,则脚本会快速运行。有什么想法为什么上述陈述有助于脚本运行一段时间?

修改的 做了一些研究,我了解到通过使用get-eventlog cmdlet,PS会解析整个事件日志。

衡量确定过去24小时内发现的应用程序错误数量需要多长时间 Measure-Command -Expression {get-eventlog -ComputerName server123 -LogName Application -EntryType Error -after (Get-Date).AddHours(-24)}

总时间:54秒

计算过去24小时内弹出的应用程序错误数*
$logs1 = get-eventlog -ComputerName server123 -LogName Application -EntryType Error -after (Get-Date).AddHours(-24) $logs1.count

有3个错误

measure-command -expression {get-eventlog -ComputerName server123 -logname application -Newest 3 }

43毫秒

为什么使用-after cmdlet指定get-eventlog参数的任何想法都会返回比指定-newest参数更长的结果?

3 个答案:

答案 0 :(得分:3)

您通过网络传输过去24小时内的所有事件,然后在本地计算机上过滤它们:

$Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24)
$Lap | where {$_.entryType -match "Error"} | Sort-Object eventid | ...

直接使用Get-EventLog进行过滤可以加快速度,因为只有过去24小时的错误事件才能通过网络传输:

$Lap = Get-EventLog -Computer $server -LogName $logname -EntryType 'Error' -After (Get-Date).AddHours(-24)
$Lap | Sort-Object eventid | ...

答案 1 :(得分:2)

cmdlet Measure-Command可用于查找命令需要多长时间。用它来了解发生了什么。将脚本拆分一下以找到最昂贵的操作。像这样的东西,

Measure-Command -Expression { $Lap = Get-EventLog -computername $server -LogName $logname -after (Get-Date).AddHours(-24) }
Measure-Command -Expression { $lap2 = $Lap| ? {$_.entryType -match "Error"}}
Measure-Command -Expression { $Lap3 = $Lap2 |Sort-Object eventid
# Keep splitting / unsplitting statements until you find the costly one
Measure-Command -Expression { $Lap3 |group-object eventid|Format-Table Name, Count -auto|fl|out-string|Add-Content $eventlogfile }

答案 2 :(得分:1)

我以前见过这个,并且使用-After大型日志文件肯定是一个性能问题。

我在使用重复日志读取时使用了索引号来加快速度:

$last_index = get-content index_history.txt

#Get the index number of the last log entry 
$index = (Get-EventLog -ComputerName $_ -LogName $log -newest 1).index 

#calculate number of events to retrieve 
if ($last_index){$n = $index - $last_index} 

#get the log entries  
$Lap = Get-EventLog -computername $server -LogName $logname -Newest $n

$index | set-content index_history.txt