Group-Object
將包含指定屬性之相同值的物件分組。
Syntax
Group-Object
[-NoElement]
[-AsHashTable]
[-AsString]
[-InputObject <PSObject>]
[[-Property] <Object[]>]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Description
Cmdlet 會 Group-Object
根據指定屬性的值,在群組中顯示物件。
Group-Object
會針對每個屬性值傳回一個數據列的數據表,以及顯示具有該值之項目數的數據行。
如果您指定多個屬性, Group-Object
請先依第一個屬性的值加以分組,然後在每個屬性群組中,依下一個屬性的值分組。
從 PowerShell 7 開始, Group-Object
可以結合 CaseSensitive 和 AsHashtable 參數來建立區分大小寫的哈希表。 哈希表索引鍵會使用區分大小寫的比較,並輸出 System.Collections.Hashtable 物件。
範例
範例 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 0 {2, 4, 6, 8...}
10 1 {1, 3, 5, 7...}
範例 3:依索引鍵值群組哈希表
從 PowerShell 6 開始, Group-Object
支援依索引鍵值排序 哈希表 輸入。
下列範例會依每個哈希表索引 weight
鍵的值,將哈希表的陣列分組。
這個範例會使用 NoElement 參數來省略群組的成員。
@(
@{ 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
範例 4:依 EntryType 分組事件記錄檔事件
此範例會在 System 事件記錄檔中顯示 1,000 個最新的專案,並依 EntryType 分組。
在輸出中, Count 資料 行代表每個群組中的項目數目。 Name 數據行代表定義群組的 EventType 值。 [ 群組 ] 數據行代表每個群組中的物件。
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...}
範例 5:依優先順序類別分組進程
此範例示範 NoElement 參數的效果。 這些命令會依優先順序類別將電腦上的處理程序分組。
第一個命令會 Get-Process
使用 Cmdlet 來取得電腦上的進程,並將對象傳送至管線。 Group-Object
依進程的 PriorityClass 屬性值,將物件分組。
第二個範例會使用 NoElement 參數,從輸出中移除群組的成員。 結果是只有 Count 和 Name 屬性值的數據表。
結果顯示在下列範例輸出中。
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
範例 6:依名稱分組進程
下列範例會使用 Group-Object
來群組在本機計算機上執行的多個進程實例。 Where-Object
顯示具有多個實例的進程。
Get-Process | Group-Object -Property Name -NoElement | Where-Object {$_.Count -gt 1}
Count Name
----- ----
2 csrss
5 svchost
2 winlogon
2 wmiprvse
範例 7:群組哈希表中的物件
這個範例會使用 AsHashTable 和 AsString 參數傳回哈希表中的群組,做為索引鍵/值組的集合。
在產生的雜湊表中,每個屬性值為索引鍵,而群組元素為值。 因為每個索引鍵是雜湊表物件的屬性,您可以使用點標記法來顯示值。
第一個命令會取得 Get
會話中的 和 Set
Cmdlet、依動詞分組、將群組傳回為哈希表,並將哈希表儲存在變數中 $A
。
第二個命令會顯示 中的 $A
哈希表。 有兩個索引鍵/值組,一個用於 Get
Cmdlet,另一個用於 Set
Cmdlet。
第三個命令會使用點表示法,$A.Get
在 中$A
顯示 Get 索引鍵的值。 這些值為 CmdletInfo 物件。 AsString 參數不會將群組中的物件轉換成字串。
$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
...
範例 8:Create 區分大小寫的哈希表
此範例結合了 CaseSensitive 和 AsHashTable 參數,以建立區分大小寫的哈希表。 範例中的檔案具有和.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}
變數 $hash
會儲存 System.Collections.Hashtable 物件。 Get-ChildItem
會從 C:\Files
目錄取得檔名,並將 System.IO.FileInfo 物件傳送至管線。 Group-Object
使用 Property value Extension 將物件分組。 CaseSensitive 和 AsHashTable 參數會建立哈希表,且索引鍵會使用區分大小寫的索引鍵.txt
和 .TXT
分組。
參數
-AsHashTable
表示這個 Cmdlet 會將群組傳回為哈希表。 雜湊表的索引鍵為屬性值,會以其為依據進行物件分組。 雜湊表的值是具有該屬性值的物件。
AsHashTable 參數本身會傳回每個哈希表,其中每個索引鍵都是群組對象的實例。 搭配 AsString 參數使用時,哈希表中的索引鍵是字串。
從 PowerShell 7 開始,若要建立區分大小寫的哈希表,請在命令中包含 CaseSensitive 和 AsHashtable 。
Type: | SwitchParameter |
Aliases: | AHT |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-AsString
表示這個 Cmdlet 會將哈希表索引鍵轉換成字串。 依預設,雜湊表索引鍵是群組物件的執行個體。 此參數只有在與 AsHashTable 參數搭配使用時才有效。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-CaseSensitive
表示此 Cmdlet 會使群組區分大小寫。 如果沒有這個參數,群組中物件的屬性值可能大小寫會有不同。
從 PowerShell 7 開始,若要建立區分大小寫的哈希表,請在命令中包含 CaseSensitive 和 AsHashtable 。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Culture
指定比較字串時要使用的文化特性。
Type: | String |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InputObject
指定要分組的物件。 輸入包含物件的變數,或輸入可取得物件的命令或運算式。
當您使用 InputObject 參數將物件的集合提交至 Group-Object
時, Group-Object
會收到一個代表集合的物件。 如此一來,它會建立該物件做為其成員的單一群組。
若要將集合中的物件群組,請使用管線將 物件傳送至 Group-Object
。
Type: | PSObject |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-NoElement
表示此 Cmdlet 會省略結果中群組的成員。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Property
指定要分組的屬性。 對象會根據指定屬性的值排列成具名群組。 未指定任何屬性時,物件會依其值或 ToString()
其值的表示來分組。 輸出會依組名以遞增順序排序。
Property 參數的值可以是新的導出屬性。 匯出屬性可以是腳本區塊或哈希表。 有效的機碼/值組為:
- 表達式 -
<string>
或<script block>
如需詳細資訊,請參閱 about_Calculated_Properties。
Type: | Object[] |
Position: | 0 |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
輸入
您可以使用管線將任何物件傳送至此 Cmdlet。
輸出
根據預設,此 Cmdlet 會傳回 GroupInfo 物件。
當您使用 AsHashTable 參數時,此 Cmdlet 會傳回 Hashtable 物件。
備註
PowerShell 包含下列的 Group-Object
別名:
- 所有平台:
group
您可以使用格式 Cmdlet 的 GroupBy 參數,例如 Format-Table
和 Format-List
來群組物件。 不同於 Group-Object
,它會為每個屬性值建立具有數據列的單一數據表, GroupBy 參數會為每個具有屬性值的專案建立一個數據列的數據表。
Group-Object
不需要群組的物件具有相同的 Microsoft .NET 類型。
將不同 .NET 類型的物件分組時, Group-Object
請使用下列規則:
相同的屬性名稱和類型。
如果物件具有具有指定名稱的屬性,而且屬性值具有相同的 .NET 類型,則屬性值會依相同類型物件所使用的相同規則分組。
相同屬性名稱、不同類型。
如果物件具有具有指定名稱的屬性,但屬性值在不同的物件中具有不同的 .NET 類型,
Group-Object
請使用屬性第一次出現的 .NET 類型做為該屬性群組的 .NET 類型。 當物件具有含不同類型的屬性時,屬性值會轉換為該群組的類型。 如果類型轉換失敗,物件就不會包含在群組中。遺漏屬性。
沒有指定屬性的物件無法分組。 未分組的物件會出現在名為 之
AutomationNull.Value
群組的最後 GroupInfo 物件輸出中。
輸出會依組名的遞增順序排序。 屬於每個群組的專案不會排序。 它們會依收到的順序列出。