提高 powershell 脚本的性能

Improving performance in a powershell script

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

这是我在 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 post 数据时:

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 

24 秒使用 REST 发送同一批 500 个事件。这个查询可以做些什么来提高性能吗?

我在一些博客中读到 Invoke-WebRequest 在 32 位上运行时提供更好的结果。还没有测试过。

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

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

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