改进PowerShell脚本中的性能

时间:2015-05-16 18:19:48

标签: powershell-v3.0

我正在尝试从evtx文件中获取存档事件列表,并在修改格式后使用REST发布数据。

以下是我在Windows 7 x64系统上获得的结果:

Measure-Command {Get-WinEvent -ea SilentlyContinue -path "C:\evtx\arindam_security_1.evtx" -Oldest -MaxEvents 500|select *,@{ Name="Event Data"; Expression={([xml]$_.ToXml()).Event.EventData.Data }} }

TotalSeconds      : 2.3954976
TotalMilliseconds : 2395.4976 

我有什么方法可以改进吗?

我已经尝试过使用filterhashtable,它花了大约5秒 - 几乎是最后一次结果的两倍。

当我使用REST发布数据时:

Measure-Command {Invoke-WebRequest -Uri https://[ip:port]/events -Body $content -Method Post -ContentType "application/json" -ErrorAction SilentlyContinue}

PS C:\Windows\system32> C:\Users\sarindam\Documents\testrest.ps1


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 24
Milliseconds      : 365
Ticks             : 243658910
TotalDays         : 0.000282012627314815
TotalHours        : 0.00676830305555556
TotalMinutes      : 0.406098183333333
TotalSeconds      : 24.365891
TotalMilliseconds : 24365.891 

使用REST发送同一批500个事件的24秒。可以使用此查询完成任何操作以提高性能吗?

我在一些博客中读到Invoke-WebRequest在32位运行时会得到更好的结果。 Haven尚未对此进行测试。

1 个答案:

答案 0 :(得分:0)

我们能够解决这个问题。任何面临类似问题的人都应该考虑用C#而不是powershell编写它。

我们编写了一个自定义dll,它将获取evt / evtx文件并将其转换为我们的平台可以理解的格式。我们使用自定义dll作为powershell脚本的一部分来循环遍历evt / evtx文件。

我们取得的成绩是100+ EPS。我们从Powershell获得的初始EPS约为18 EPS,多线程我们可以达到80 EPS左右。