共用方式為


Group-Object

將包含指定屬性相同值的物件分組。

語法

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

Description

Group-Object Cmdlet 會根據指定屬性的值,在群組中顯示物件。 Group-Object 會針對每個屬性值傳回一個數據列的數據表,以及一個顯示具有該值之項目數的數據行。

如果您指定多個屬性,Group-Object 先依第一個屬性的值加以分組,然後在每個屬性群組中,依下一個屬性的值分組。

範例

範例 1:依擴展名分組檔案

這個範例會遞歸地取得 $PSHOME 下的檔案,並依擴展名將它們分組。 輸出會傳送至 Sort-Object Cmdlet,依針對指定擴展名找到的計數檔案加以排序。 空 Name 代表目錄。

此範例會使用 NoElement 參數來省略群組的成員。

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

範例 2:依奇數和偶數分組整數

此範例示範如何使用腳本區塊作為 Property 參數的值。

此命令會顯示從 1 到 20 的整數,並依賠率和偶數分組。

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

Count Name                      Group
----- ----                      -----
   10 1                         {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
   10 0                         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}

範例 3:依 EntryType 分組事件記錄事件

這些命令會顯示 System 事件記錄檔中最近 1,000 個專案,並依 entryType分組

在輸出中,Count 數據行代表每個群組中的專案數、Name 資料行代表定義群組的 EventType 值,而 Group 數據行代表每個群組中的物件。

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

範例 4:依優先順序類別分組進程

此範例示範 NoElement 參數的效果。 這些命令會依優先順序類別將計算機上的進程分組。

第一個命令會使用 Get-Process Cmdlet 來取得電腦上的進程。 它會使用管線運算符 | 將結果傳送至 Group-Object,其會依進程的 PriorityClass 屬性的值將物件分組。

第二個命令與第一個命令相同,不同之處在於它會使用 NoElement 參數,從輸出中排除群組的成員。 結果是只有計數和屬性值名稱的數據表。

結果會顯示在下列範例輸出中。

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

範例 5:依名稱分組進程

下列範例會使用 Group-Object 到本機計算機上執行的多個進程實例。

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

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

範例 8:群組哈希表中的物件

這個範例會使用 AsHashTableAsString 參數來傳回哈希表中的群組,也就是索引鍵/值組的集合。

在產生的哈希表中,每個屬性值都是索引鍵,而群組元素則是值。 因為每個索引鍵都是哈希表對象的屬性,因此您可以使用點表示法來顯示值。

第一個命令會取得會話中的 GetSet Cmdlet、依動詞將群組分組、以哈希表傳回群組,並將哈希表儲存在 $A 變數中。

第二個命令會在 $A中顯示哈希表。 有兩個索引鍵/值組,一個用於 Get Cmdlet,另一個用於 Set Cmdlet。

第三個命令會使用點表示法,在 $A中顯示 Get 索引鍵的值。 這些值 CmdletInfo 物件。 AsString 參數不會將群組中的物件轉換成字串。

$A = Get-Command get-*, set-* -CommandType cmdlet | Group-Object -Property verb -AsHashTable -AsString
$A

Name    Value
----    -----
Get     {Get-PSCallStack, Get-PSBreakpoint, Get-PSDrive, Get-PSSession...}
Set     {Set-Service, Set-StrictMode, Set-PSDebug, Set-PSSessionConfiguration...}

$A.get

CommandType     Name                 Definition
-----------     ----                 ----------
Cmdlet          Get-PSCallStack      Get-PSCallStack [-Verbose] [-Debug] [-ErrorAction <ActionPrefer...
Cmdlet          Get-PSBreakpoint     Get-PSBreakpoint [[-Id] <Int32[]>] [-Verbose] [-Debug] [-ErrorA...
Cmdlet          Get-PSDrive          Get-PSDrive [[-Name] <String[]>] [-Scope <String>] [-PSProvider...
...

參數

-AsHashTable

指出此 Cmdlet 會將群組當做哈希表傳回。 哈希表的索引鍵是物件分組的屬性值。 哈希表的值是具有該屬性值的物件。

根據本身,AsHashTable 參數會傳回每個哈希表,其中每個索引鍵都是群組對象的實例。 搭配 AsString 參數使用時,哈希表中的索引鍵為字串。

類型:SwitchParameter
別名:AHT
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-AsString

指出這個 Cmdlet 會將哈希表索引鍵轉換成字串。 根據預設,哈希表索引鍵是群組對象的實例。 此參數只有在與 AsHashTable 參數搭配使用時才有效。

類型:SwitchParameter
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-CaseSensitive

表示此 Cmdlet 會區分大小寫。 如果沒有此參數,群組中對象的屬性值可能會有不同的情況。

類型:SwitchParameter
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-Culture

指定要在比較字串時使用的文化特性。

類型:String
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-InputObject

指定要分組的物件。 輸入包含 物件的變數,或輸入取得物件的命令或表達式。

當您使用 InputObject 參數將物件的集合提交至 Group-Object時,Group-Object 會收到代表集合的一個物件。 因此,它會建立具有該對象作為其成員的單一群組。

若要將集合中的物件群組,請使用管線將 物件傳送至 Group-Object

類型:PSObject
Position:Named
預設值:None
必要:False
接受管線輸入:True
接受萬用字元:False

-NoElement

表示此 Cmdlet 會從結果中省略群組的成員。

類型:SwitchParameter
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-Property

指定群組的屬性。 對象會根據指定屬性的值排列成群組。

Property 參數的值可以是新的導出屬性。 若要建立導出的屬性,請使用指定字串或腳本區塊值的 Expression 索引鍵建立哈希表。

類型:Object[]
Position:0
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

輸入

PSObject

您可以使用管線將任何物件傳送至 Group-Object

輸出

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

當您使用 AsHashTable 參數時,Group-Object 會傳回哈希表。 否則,它會傳回 GroupInfo 物件。

備註

  • 您也可以使用格式化 Cmdlet 的 GroupBy 參數來群組物件,例如 Format-TableFormat-List。 不同於 Group-Object,它會為每個屬性值建立具有數據列的單一數據表,GroupBy 參數會為每個屬性值建立數據表,其中每個具有屬性值的專案各有一個數據列。

    Group-Object 不需要群組的物件與 .NET Framework 類型相同Microsoft。 將不同 .NET Framework 類型的物件分組時,Group-Object 會使用下列規則:

    • 相同的屬性名稱和類型。 如果物件具有具有指定名稱的屬性,而屬性值具有相同的 .NET Framework 類型,則屬性值會使用相同類型物件所使用的相同規則來分組。

    • 相同的屬性名稱,不同類型的。 如果物件具有具有指定名稱的屬性,但屬性值在不同的物件中有不同的 .NET Framework 類型,Group-Object 使用屬性第一次出現的 .NET Framework 類型做為該屬性群組的 .NET Framework 類型。 當物件具有具有不同類型的屬性時,屬性值會轉換成該群組的類型。 如果類型轉換失敗,物件就不會包含在群組中。

    • 遺漏屬性。 沒有指定屬性的物件會被視為無法群組。 無法群組的物件會出現在最終 GroupInfo 中, 名為 AutomationNull.Value的群組中對象輸出。