Freigeben über


Group-Object

Gruppiert Objekte, die den gleichen Wert für die angegebenen Eigenschaften enthalten.

Syntax

Group-Object
     [-NoElement]
     [-AsHashTable]
     [-AsString]
     [-InputObject <PSObject>]
     [[-Property] <Object[]>]
     [-Culture <String>]
     [-CaseSensitive]
     [<CommonParameters>]

Beschreibung

Das Group-Object Cmdlet zeigt Objekte in Gruppen basierend auf dem Wert einer angegebenen Eigenschaft an. Group-Object gibt eine Tabelle mit einer Zeile für jeden Eigenschaftswert und eine Spalte zurück, die die Anzahl der Elemente mit diesem Wert anzeigt.

Wenn Sie mehrere Eigenschaften angeben, Group-Object gruppiert sie zuerst nach den Werten der ersten Eigenschaft, und gruppiert sie dann innerhalb jeder Eigenschaftsgruppe nach dem Wert der nächsten Eigenschaft.

Ab PowerShell 7 können die Parameter "CaseSensitive" und "AsHashtable" kombiniert werden, Group-Object um eine Hashtabelle mit Groß-/Kleinschreibung zu erstellen. Bei den Hashtabellenschlüsseln wird zwischen Groß-/Kleinschreibung unterschieden und ein System.Collections.Hashtable-Objekt ausgegeben.

Beispiele

Beispiel 1: Gruppieren von Dateien nach Erweiterung

In diesem Beispiel werden die Dateien rekursiv abgerufen $PSHOME und nach Dateinamenerweiterung gruppiert. Die Ausgabe wird an das Sort-Object Cmdlet gesendet, das sie nach den Anzahldateien sortiert, die für die angegebene Erweiterung gefunden wurden. Der leere Name stellt Verzeichnisse dar.

In diesem Beispiel wird der Parameter NoElement verwendet, um die Mitglieder der Gruppe auszulassen.

$files = Get-ChildItem -Path $PSHOME -Recurse
$files |
    Group-Object -Property extension -NoElement |
    Sort-Object -Property Count -Descending

Count Name
----- ----
  365 .xml
  231 .cdxml
  197
  169 .ps1xml
  142 .txt
  114 .psd1
   63 .psm1
   49 .xsd
   36 .dll
   15 .mfl
   15 .mof
...

Beispiel 2: Gruppieren ganzzahliger Zahlen nach Ungerade und Geraden

In diesem Beispiel wird gezeigt, wie Skriptblöcke als Wert des Property-Parameters verwendet werden. Mit diesem Befehl werden die ganzzahligen Zahlen von 1 bis 20 angezeigt, gruppiert nach Ungerade und sogar.

1..20 | Group-Object -Property {$_ % 2}

Count Name                      Group
----- ----                      -----
   10 0                         {2, 4, 6, 8...}
   10 1                         {1, 3, 5, 7...}

Beispiel 3: Gruppieren von Hashtables nach Schlüsselwert

Ab PowerShell 6 Group-Object unterstützt die Sortierung von Hashtable-Eingaben nach Schlüsselwerten. Im folgenden Beispiel wird ein Array von Hashtables nach dem Wert des Schlüssels weight der einzelnen Hashtables gruppiert.

In diesem Beispiel wird der Parameter NoElement verwendet, um die Mitglieder der Gruppe auszulassen.

@(
    @{ name = 'a' ; weight = 7 }
    @{ name = 'b' ; weight = 1 }
    @{ name = 'c' ; weight = 3 }
    @{ name = 'd' ; weight = 7 }
) | Group-Object -Property weight -NoElement

Count Name
----- ----
    1 1
    1 3
    2 7

Beispiel 4: Gruppieren von Ereignisprotokollereignissen nach EntryType

In diesem Beispiel werden die 1.000 neuesten Einträge im Systemereignisprotokoll angezeigt, gruppiert nach EntryType.

In der Ausgabe stellt die Spalte "Anzahl " die Anzahl der Einträge in jeder Gruppe dar. Die Spalte "Name " stellt die EventType-Werte dar, die eine Gruppe definieren. Die Spalte "Gruppe " stellt die Objekte in jeder Gruppe dar.

Get-WinEvent -LogName System -MaxEvents 1000 | Group-Object -Property LevelDisplayName

Count Name          Group
----- ----          -----
  153 Error         {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}
  722 Information   {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}
  125 Warning       {System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diag...}

Beispiel 5: Gruppieren von Prozessen nach Prioritätsklasse

In diesem Beispiel wird der Effekt des NoElement-Parameters veranschaulicht. Diese Befehle gruppieren die Prozesse auf dem Computer nach Prioritätsklasse.

Der erste Befehl verwendet das Get-Process Cmdlet, um die Prozesse auf dem Computer abzurufen und die Objekte an die Pipeline zu senden. Group-Objectgruppiert die Objekte nach dem Wert der PriorityClass-Eigenschaft des Prozesses.

Im zweiten Beispiel wird der Parameter NoElement verwendet, um die Mitglieder der Gruppe aus der Ausgabe zu entfernen. Das Ergebnis ist eine Tabelle mit nur dem Wert der Count- und Name-Eigenschaft.

Die Ergebnisse werden in der folgenden Beispielausgabe gezeigt.

Get-Process | Group-Object -Property PriorityClass

Count Name         Group
----- ----         -----
   55 Normal       {System.Diagnostics.Process (AdtAgent), System.Diagnosti...
    1              {System.Diagnostics.Process (Idle)}
    3 High         {System.Diagnostics.Process (Newproc), System.Diagnostic...
    2 BelowNormal  {System.Diagnostics.Process (winperf),

Get-Process | Group-Object -Property PriorityClass -NoElement

Count Name
----- ----
   55 Normal
    1
    3 High
    2 BelowNormal

Beispiel 6: Gruppieren von Prozessen nach Name

Im folgenden Beispiel werden Group-Object mehrere Instanzen von Prozessen gruppiert, die auf dem lokalen Computer ausgeführt werden. Where-Object zeigt Prozesse mit mehr als einer Instanz an.

Get-Process | Group-Object -Property Name -NoElement | Where-Object {$_.Count -gt 1}

Count Name
----- ----
2     csrss
5     svchost
2     winlogon
2     wmiprvse

Beispiel 7: Gruppieren von Objekten in einer Hashtabelle

In diesem Beispiel werden die Parameter AsHashTable und AsString verwendet, um die Gruppen in einer Hashtabelle als Sammlung von Schlüsselwertpaaren zurückzugeben.

In der resultierenden Hashtabelle ist jeder Eigenschaftswert ein Schlüssel und die Gruppenelemente sind die Werte. Da jeder Schlüssel eine Eigenschaft des Hashtabellenobjekts ist, können Sie die Werte mithilfe der punktierten Schreibweise anzeigen.

Der erste Befehl ruft die Get und Set Cmdlets in der Sitzung ab, gruppiert sie nach Verb, gibt die Gruppen als Hashtabelle zurück und speichert die Hashtabelle in der $A Variablen.

Der zweite Befehl zeigt die Hashtabelle in $A. Es gibt zwei Schlüsselwertpaare, eines für die Get Cmdlets und eines für die Set Cmdlets.

Der dritte Befehl verwendet Punktnotation, $A.Get um die Werte der Get-Taste in $Aanzuzeigen. Die Werte sind CmdletInfo-Objekt . Der AsString-Parameter konvertiert die Objekte in den Gruppen nicht in Zeichenfolgen.

$A = Get-Command Get-*, Set-* -CommandType cmdlet |
     Group-Object -Property Verb -AsHashTable -AsString
$A

Name     Value
----     -----
Get      {Get-Acl, Get-Alias, Get-AppLockerFileInformation, Get-AppLockerPolicy...}
Set      {Set-Acl, Set-Alias, Set-AppBackgroundTaskResourcePolicy, Set-AppLockerPolicy...}

$A.Get

CommandType     Name                              Version    Source
-----------     ----                              -------    ------
Cmdlet          Get-Acl                           7.0.0.0    Microsoft.PowerShell.Security
Cmdlet          Get-Alias                         7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Get-AppLockerFileInformation      2.0.0.0    AppLocker
Cmdlet          Get-AppLockerPolicy               2.0.0.0    AppLocker
...

Beispiel 8: Erstellen einer Hashtabelle mit Groß-/Kleinschreibung

In diesem Beispiel werden die Parameter CaseSensitive und AsHashTable kombiniert, um eine Hashtabelle mit Groß-/Kleinschreibung zu erstellen. Die Dateien im Beispiel haben Erweiterungen und .txt .TXT.

$hash = Get-ChildItem -Path C:\Files |
        Group-Object -Property Extension -CaseSensitive -AsHashTable
$hash

Name           Value
----           -----
.TXT           {C:\Files\File7.TXT, C:\Files\File8.TXT, C:\Files\File9.TXT}
.txt           {C:\Files\file1.txt, C:\Files\file2.txt, C:\Files\file3.txt}

Die $hash Variable speichert das System.Collections.Hashtable-Objekt . Get-ChildItem ruft die Dateinamen aus dem C:\Files Verzeichnis ab und sendet die System.IO.FileInfo -Objekte an die Pipeline. Group-Objectgruppiert die Objekte mithilfe der Eigenschaftswerterweiterung. Die Parameter "CaseSensitive" und "AsHashTable" erstellen die Hashtabelle, und die Schlüssel werden mithilfe der Groß-/.TXTKleinschreibung und der Schlüssel .txt gruppiert.

Parameter

-AsHashTable

Gibt an, dass dieses Cmdlet die Gruppe als Hashtabelle zurückgibt. Die Schlüssel der Hashtabelle sind die Eigenschaftswerte, nach denen die Objekte gruppiert werden. Die Werte der Hashtabelle sind die Objekte, die diesen Eigenschaftswert aufweisen.

Der Parameter AsHashTable gibt selbst jede Hashtabelle zurück, in der jeder Schlüssel eine Instanz des gruppierten Objekts ist. Bei Verwendung mit dem AsString-Parameter sind die Schlüssel in der Hashtabelle Zeichenfolgen.

Fügen Sie ab PowerShell 7, um Hashtabellen mit Groß-/Kleinschreibung zu erstellen, Groß -/Kleinschreibung und AsHashtable in Ihrem Befehl ein.

Typ:SwitchParameter
Aliase:AHT
Position:Named
Standardwert:False
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-AsString

Gibt an, dass dieses Cmdlet die Hashtabellenschlüssel in Zeichenfolgen konvertiert. Standardmäßig sind die Schlüssel in der Hashtabelle Instanzen des gruppierten Objekts. Dieser Parameter ist nur gültig, wenn er mit dem AsHashTable-Parameter verwendet wird.

Typ:SwitchParameter
Position:Named
Standardwert:False
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-CaseSensitive

Gibt an, dass mit diesem Cmdlet die Groß-/Kleinschreibung der Gruppierung beachtet wird. Ohne diesen Parameter können die Eigenschaftswerte von Objekten in einer Gruppe groß- oder kleingeschrieben sein.

Fügen Sie ab PowerShell 7, um Hashtabellen mit Groß-/Kleinschreibung zu erstellen, Groß -/Kleinschreibung und AsHashtable in Ihrem Befehl ein.

Typ:SwitchParameter
Position:Named
Standardwert:False
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-Culture

Gibt die Kultur an, die beim Vergleichen von Zeichenfolgen verwendet werden soll.

Typ:String
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-InputObject

Gibt die zu gruppierenden Objekte an. Geben Sie eine Variable ein, die die Objekte enthält, oder geben Sie einen Befehl oder einen Ausdruck ein, mit dem die Objekte abgerufen werden.

Wenn Sie den InputObject-Parameter verwenden, um eine Auflistung von Objekten an , Group-ObjectGroup-Object empfängt ein Objekt, das die Auflistung darstellt. Daher erstellt es eine einzelne Gruppe mit diesem Objekt als Member.

Um die Objekte in einer Auflistung zu gruppieren, führen Sie die Objekte an Group-Object.

Typ:PSObject
Position:Named
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:True
Platzhalterzeichen akzeptieren:False

-NoElement

Gibt an, dass dieses Cmdlet die Mitglieder einer Gruppe aus den Ergebnissen ausgelassen.

Typ:SwitchParameter
Position:Named
Standardwert:False
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

-Property

Gibt die Eigenschaften für die Gruppierung an. Die Objekte werden basierend auf dem Wert der angegebenen Eigenschaften in benannte Gruppen angeordnet. Wenn keine Eigenschaft angegeben wird, werden Objekte nach ihrem Wert oder der ToString() Darstellung ihres Werts gruppiert. Die Ausgabe wird nach den Gruppennamen in aufsteigender Reihenfolge sortiert.

Der Wert des Property-Parameters kann eine neue berechnete Eigenschaft sein. Die berechnete Eigenschaft kann ein Skriptblock oder eine Hashtabelle sein. Gültige Schlüsselwertpaare sind:

  • Ausdruck - <string> oder <script block>

Weitere Informationen finden Sie unter about_Calculated_Properties.

Typ:Object[]
Position:0
Standardwert:None
Erforderlich:False
Pipelineeingabe akzeptieren:False
Platzhalterzeichen akzeptieren:False

Eingaben

PSObject

Sie können jedes Objekt an dieses Cmdlet weiterleiten.

Ausgaben

GroupInfo

Standardmäßig gibt dieses Cmdlet ein GroupInfo-Objekt zurück.

Hashtable

Wenn Sie den Parameter AsHashTable verwenden, gibt dieses Cmdlet ein Hashtable-Objekt zurück.

Hinweise

PowerShell enthält die folgenden Aliase für Group-Object:

  • Alle Plattformen:
    • group

Sie können den GroupBy-Parameter der Formatierungs-Cmdlets verwenden, z Format-Table . B. und Format-List, um Objekte zu gruppieren. Im Gegensatz dazu Group-Objecterstellt die GroupBy-Parameter eine einzelne Tabelle mit einer Zeile für jeden Eigenschaftswert, die eine Tabelle für jeden Eigenschaftswert mit einer Zeile für jedes Element mit dem Eigenschaftswert erstellt.

Group-Object erfordert nicht, dass die gruppierten Objekte denselben Microsoft .NET-Typ aufweisen. Beim Gruppieren von Objekten verschiedener .NET-Typen Group-Object werden die folgenden Regeln verwendet:

  • Gleiche Eigenschaftsnamen und -typen.

    Wenn die Objekte eine Eigenschaft mit dem angegebenen Namen haben und die Eigenschaftswerte denselben .NET-Typ aufweisen, werden die Eigenschaftswerte nach den gleichen Regeln gruppiert, die für Objekte desselben Typs verwendet werden.

  • Gleiche Eigenschaftsnamen, verschiedene Typen.

    Wenn die Objekte eine Eigenschaft mit dem angegebenen Namen haben, aber die Eigenschaftswerte einen anderen .NET-Typ in verschiedenen Objekten aufweisen, Group-Object verwendet den .NET-Typ des ersten Vorkommens der Eigenschaft als .NET-Typ für diese Eigenschaftsgruppe. Wenn ein Objekt eine Eigenschaft mit einem anderen Typ aufweist, wird der Eigenschaftswert in den Typ für diese Gruppe konvertiert. Wenn die Typkonvertierung fehlschlägt, ist das Objekt nicht in der Gruppe enthalten.

  • Fehlende Eigenschaften.

    Objekte, die nicht über eine angegebene Eigenschaft verfügen, können nicht gruppiert werden. Objekte, die nicht gruppiert sind, werden in der endgültigen GroupInfo-Objektausgabe in einer Gruppe mit dem Namen AutomationNull.Valueangezeigt.

Die Ausgabe wird nach den Gruppennamen in aufsteigender Reihenfolge sortiert. Die Elemente, die zu jeder Gruppe gehören, werden nicht sortiert. Sie werden in der Reihenfolge aufgeführt, in der sie empfangen wurden.