Group-Object

Grupuje obiekty zawierające tę samą wartość dla określonych właściwości.

Składnia

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

Opis

Polecenie Group-Object cmdlet wyświetla obiekty w grupach na podstawie wartości określonej właściwości. Group-Object Zwraca tabelę z jednym wierszem dla każdej wartości właściwości i kolumną, która wyświetla liczbę elementów o tej wartości.

Jeśli określisz więcej niż jedną właściwość, Group-Object najpierw grupuje je według wartości pierwszej właściwości, a następnie w każdej grupie właściwości grupuje ją według wartości następnej właściwości.

Począwszy od programu PowerShell 7, można połączyć parametry CaseSensitive i AsHashtable, Group-Object aby utworzyć tabelę skrótów uwzględniającą wielkość liter. Klucze tabeli skrótów używają porównań z uwzględnieniem wielkości liter i danych wyjściowych obiektu System.Collections.Hashtable .

Przykłady

Przykład 1. Grupowanie plików według rozszerzenia

Ten przykład rekursywnie pobiera pliki w obszarze $PSHOME i grupuje je według rozszerzenia nazwy pliku. Dane wyjściowe są wysyłane do Sort-Object polecenia cmdlet, które sortuje je według liczby plików znalezionych dla danego rozszerzenia. Pusta nazwa reprezentuje katalogi.

W tym przykładzie użyto parametru NoElement , aby pominąć członków grupy.

$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
...

Przykład 2. Liczba całkowita grupy według kursów i parzystów

W tym przykładzie pokazano, jak używać bloków skryptu jako wartości parametru Właściwość . To polecenie wyświetla liczby całkowite z zakresu od 1 do 20, pogrupowane według kursy, a nawet.

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

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

Przykład 3. Grupowanie zdarzeń dziennika zdarzeń według typu EntryType

W tym przykładzie przedstawiono 1000 najnowszych wpisów w dzienniku zdarzeń systemu pogrupowanych według typu EntryType.

W danych wyjściowych kolumna Count reprezentuje liczbę wpisów w każdej grupie. Kolumna Name reprezentuje wartości EventType , które definiują grupę. Kolumna Grupa reprezentuje obiekty w każdej grupie.

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

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

Przykład 4. Grupowanie procesów według klasy priorytetu

W tym przykładzie pokazano efekt parametru NoElement . Te polecenia grupuje procesy na komputerze według klasy priorytetu.

Pierwsze polecenie używa Get-Process polecenia cmdlet do pobierania procesów na komputerze i wysyłania obiektów w dół potoku. Group-Objectgrupuje obiekty według wartości właściwości PriorityClass procesu.

W drugim przykładzie użyto parametru NoElement , aby wyeliminować członków grupy z danych wyjściowych. Wynik jest tabelą z tylko wartością właściwości Count i Name .

Wyniki są wyświetlane w poniższych przykładowych danych wyjściowych.

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

Przykład 5. Grupowanie procesów według nazwy

W poniższym przykładzie użyto Group-Object do grupowania wielu wystąpień procesów uruchomionych na komputerze lokalnym. Where-Object wyświetla procesy z więcej niż jednym wystąpieniem.

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

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

Przykład 6. Grupowanie obiektów w tabeli skrótów

W tym przykładzie użyto parametrów AsHashTable i AsString w celu zwrócenia grup w tabeli skrótów jako kolekcji par klucz-wartość.

W wynikowej tabeli skrótów każda wartość właściwości jest kluczem, a elementy grupy są wartościami. Ponieważ każdy klucz jest właściwością obiektu tabeli skrótów, można użyć notacji kropkowej, aby wyświetlić wartości.

Pierwsze polecenie pobiera Get polecenia cmdlet i Set w sesji, grupuje je według czasownika, zwraca grupy jako tabelę skrótów i zapisuje tabelę skrótów w zmiennej $A .

Drugie polecenie wyświetla tabelę skrótów w pliku $A. Istnieją dwie pary klucz-wartość, jedna dla Get poleceń cmdlet i jedna dla Set poleceń cmdlet.

Trzecie polecenie używa notacji kropkowej, $A.Get aby wyświetlić wartości klucza Get w $Apliku . Wartości to obiekt CmdletInfo . Parametr AsString nie konwertuje obiektów w grupach na ciągi.

$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
...

Przykład 7. Tworzenie tabeli skrótu uwzględniającej wielkość liter

Ten przykład łączy parametry CaseSensitive i AsHashTable , aby utworzyć tabelę skrótów uwzględniającą wielkość liter. Pliki w przykładzie mają rozszerzenia .txt i .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}

Zmienna $hash przechowuje obiekt System.Collections.Hashtable . Get-ChildItem pobiera nazwy plików z C:\Files katalogu i wysyła obiekty System.IO.FileInfo w dół potoku. Group-Objectgrupuje obiekty przy użyciu rozszerzenia wartości właściwości. Parametry CaseSensitive i AsHashTable tworzą tabelę skrótów, a klucze są grupowane przy użyciu kluczy .txt z uwzględnieniem wielkości liter i .TXT.

Parametry

-AsHashTable

Wskazuje, że to polecenie cmdlet zwraca grupę jako tabelę skrótów. Klucze tabeli skrótów są wartościami właściwości, według których obiekty są pogrupowane. Wartości tabeli skrótów są obiektami, które mają wartość tej właściwości.

Sam parametr AsHashTable zwraca każdą tabelę skrótów, w której każdy klucz jest wystąpieniem pogrupowanego obiektu. W przypadku użycia z parametrem AsString klucze w tabeli skrótów są ciągami.

Począwszy od programu PowerShell 7, aby utworzyć tabele skrótów uwzględniające wielkość liter, dołącz funkcję CaseSensitive i AsHashtable w poleceniu .

Type:SwitchParameter
Aliases:AHT
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-AsString

Wskazuje, że to polecenie cmdlet konwertuje klucze tabeli skrótów na ciągi. Domyślnie klucze tabeli skrótów są wystąpieniami pogrupowanego obiektu. Ten parametr jest prawidłowy tylko w przypadku użycia z parametrem AsHashTable .

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-CaseSensitive

Wskazuje, że to polecenie cmdlet sprawia, że rozróżniana jest wielkość liter grupowania. Bez tego parametru wartości właściwości obiektów w grupie mogą mieć różne przypadki.

Począwszy od programu PowerShell 7, aby utworzyć tabele skrótów uwzględniające wielkość liter, dołącz funkcję CaseSensitive i AsHashtable w poleceniu .

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

Określa kulturę, która ma być używana podczas porównywania ciągów.

Type:String
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Określa obiekty do grupowania. Wprowadź zmienną zawierającą obiekty lub wpisz polecenie lub wyrażenie, które pobiera obiekty.

Gdy używasz parametru InputObject do przesyłania kolekcji obiektów do Group-Objectprogramu , Group-Object odbiera jeden obiekt reprezentujący kolekcję. W rezultacie tworzy pojedynczą grupę z tym obiektem jako element członkowski.

Aby zgrupować obiekty w kolekcji, należy przekazać potok do obiektów .Group-Object

Type:PSObject
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-NoElement

Wskazuje, że to polecenie cmdlet pomija członków grupy z wyników.

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

Określa właściwości grupowania. Obiekty są rozmieszczane w grupy na podstawie wartości określonej właściwości.

Wartość parametru Właściwości może być nową właściwością obliczeniową. Właściwość obliczeniowa może być blokiem skryptu lub tabelą skrótów. Prawidłowe pary klucz-wartość to:

  • Wyrażenie — <string> lub <script block>

Aby uzyskać więcej informacji, zobacz about_Calculated_Properties.

Type:Object[]
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

Dane wejściowe

PSObject

Możesz przekazać dowolny obiekt do Group-Objectobiektu .

Dane wyjściowe

Microsoft.PowerShell.Commands.GroupInfo or System.Collections.Hashtable

Gdy używasz parametru AsHashTable , Group-Object zwraca obiekt Hashtable . W przeciwnym razie zwraca obiekt GroupInfo .

Uwagi

Można użyć parametru GroupBy poleceń cmdlet formatowania, takich jak Format-Table i Format-List, do grupowania obiektów. W przeciwieństwie do Group-Objectmetody , która tworzy pojedynczą tabelę z wierszem dla każdej wartości właściwości, parametry GroupBy tworzą tabelę dla każdej wartości właściwości z wierszem dla każdego elementu, który ma wartość właściwości.

Group-Object nie wymaga, aby obiekty zgrupowane były tego samego typu platformy Microsoft .NET Core. Podczas grupowania obiektów różnych typów Group-Object platformy .NET Core są używane następujące reguły:

  • Te same nazwy i typy właściwości.

    Jeśli obiekty mają właściwość o określonej nazwie, a wartości właściwości mają ten sam typ platformy .NET Core, wartości właściwości są pogrupowane przy użyciu tych samych reguł, które będą używane dla obiektów tego samego typu.

  • Te same nazwy właściwości, różne typy.

    Jeśli obiekty mają właściwość o określonej nazwie, ale wartości właściwości mają inny typ platformy .NET Core w różnych obiektach, Group-Object używa typu .NET Core pierwszego wystąpienia właściwości jako typu .NET Core dla tej grupy właściwości. Gdy obiekt ma właściwość o innym typie, wartość właściwości jest konwertowana na typ dla tej grupy. Jeśli konwersja typu nie powiedzie się, obiekt nie jest uwzględniony w grupie.

  • Brakujące właściwości.

    Nie można grupować obiektów, które nie mają określonej właściwości. Obiekty, które nie są pogrupowane, są wyświetlane w końcowych danych wyjściowych obiektu GroupInfo w grupie o nazwie AutomationNull.Value.