Der Where-Object PowerShell Befehl ist nicht unbedingt der schnellste Befehl, wenn man damit versucht etwas in größeren Objekten zu finden, oder wenn er innerhalb von Schleifen oft benutzt wird, können sich die Ausführungszeiten massiv aufaddieren.
Eine mögliche Lösung für die Problematik stellt der folgende kleine CSharp Codeblock dar, denn man innerhalb von PowerShell alternativ benutzen kann.
Zeile 1-22 stellt die benötigte CSharp Logik innerhalb von PowerShell bereit
Zeile 27-30 zeigt als Negativbeispiel die Verwendung von Where-Object und miss dessen Ausführungszeit
Zeile 32-35 zeigt die alternative Verwendung der CSharp FastSearch Logik und misst dessen Ausführungszeit
Die Ausführungszeit ist von vielen Faktoren abhängig, wie z.B. der Objektgröße, bei meinen Test war die CSharp Logik um den Faktor 5-20 schneller
# FastSearch function
$Source = @"
using System;
using System.Management.Automation;
using System.Collections.Generic;
namespace FastSearch
{
public static class Search
{
public static List<object width="300" height="150" data-mce-fragment="1"> Find(PSObject[] collection, string column, string data)
{
List<object> results = new List<object>();
foreach(PSObject item in collection)
{
if (item.Properties[column].Value.ToString() == data) { results.Add(item); }
}
return results;
}
}
}
"@
Add-Type -TypeDefinition $Source -Language CSharp
# Get an example object with many entries
$ExampleObject = Get-EventLog -LogName Information -Newest 50000
# Example search with Where-Object and measure the execution time
Measure-Command {
$Result = $ExampleObject | Where-Object {$_.EntryType -eq 'Error'}
}
# Example search with FastSearch
Measure-Command {
$Result = [FastSearch.Search]::Find($ExampleObject,'EntryType','Error')
}
<span id="mce_marker" data-mce-type="bookmark"></span></object></object></object>