Group-Object
將包含指定屬性相同值的物件分組。
語法
HashTable
Group-Object
[[-Property] <Object[]>]
[-NoElement]
[-AsHashTable]
[-AsString]
[-InputObject <PSObject>]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Description
Group-Object Cmdlet 會根據指定屬性的值,在群組中顯示物件。
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:依 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 參數從輸出中消除組的成員。 結果是只有 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
範例 5:依名稱分組進程
下列範例會使用 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
範例 6:群組哈希表中的物件
這個範例會使用 AsHashTable 和 AsString 參數,以傳回哈希表中的群組,做為索引鍵/值組的集合。
在產生的哈希表中,每個屬性值都是索引鍵,而群組元素則是值。 因為每個索引鍵都是哈希表對象的屬性,因此您可以使用點表示法來顯示值。
第一個命令會取得會話中的 Get 和 Set Cmdlet、依動詞將群組分組、以哈希表傳回群組,並將哈希表儲存在 $A 變數中。
第二個命令會在 $A中顯示哈希表。 有兩個索引鍵/值組,一個用於 Get Cmdlet,另一個用於 Set Cmdlet。
第三個命令會使用點表示法,$A.Get 在 中顯示 $A 索引鍵的值。 這些值 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
...
範例 7:創建區分大小寫的哈希表
此範例會結合 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 值 Extension來群組物件。
CaseSensitive 和 AsHashTable 參數會建立哈希表,而索引鍵會使用區分大小寫的索引鍵分組 .txt 和 .TXT。
參數
-AsHashTable
指出此 Cmdlet 會將群組當做哈希表傳回。 哈希表的索引鍵是物件分組的屬性值。 哈希表的值是具有該屬性值的物件。
根據本身,AsHashTable 參數會傳回每個哈希表,其中每個索引鍵都是群組對象的實例。 搭配 AsString 參數使用時,哈希表中的索引鍵為字串。
從 PowerShell 7 開始,若要建立區分大小寫的哈希表,請在命令中包含 CaseSensitive 和 AsHashtable。
參數屬性
| 類型: | SwitchParameter |
| 預設值: | False |
| 支援萬用字元: | False |
| 不要顯示: | False |
| 別名: | 平均處理時間 (AHT) |
參數集
(All)
| Position: | Named |
| 必要: | False |
| 來自管線的值: | False |
| 來自管線按屬性名稱的值: | False |
| 來自剩餘引數的值: | False |
-AsString
指出這個 Cmdlet 會將哈希表索引鍵轉換成字串。 根據預設,哈希表索引鍵是群組對象的實例。 此參數只有在與 AsHashTable 參數搭配使用時才有效。
參數屬性
| 類型: | SwitchParameter |
| 預設值: | False |
| 支援萬用字元: | False |
| 不要顯示: | False |
參數集
(All)
| Position: | Named |
| 必要: | False |
| 來自管線的值: | False |
| 來自管線按屬性名稱的值: | False |
| 來自剩餘引數的值: | False |
-CaseSensitive
表示此 Cmdlet 會區分大小寫。 如果沒有此參數,群組中對象的屬性值可能會有不同的情況。
從 PowerShell 7 開始,若要建立區分大小寫的哈希表,請在命令中包含 CaseSensitive 和 AsHashtable。
參數屬性
| 類型: | SwitchParameter |
| 預設值: | False |
| 支援萬用字元: | False |
| 不要顯示: | False |
參數集
(All)
| Position: | Named |
| 必要: | False |
| 來自管線的值: | False |
| 來自管線按屬性名稱的值: | False |
| 來自剩餘引數的值: | False |
-Culture
指定要在比較字串時使用的文化特性。
參數屬性
| 類型: | String |
| 預設值: | None |
| 支援萬用字元: | False |
| 不要顯示: | False |
參數集
(All)
| Position: | Named |
| 必要: | False |
| 來自管線的值: | False |
| 來自管線按屬性名稱的值: | False |
| 來自剩餘引數的值: | False |
-InputObject
指定要分組的物件。 輸入包含 物件的變數,或輸入取得物件的命令或表達式。
當您使用 InputObject 參數將物件的集合提交至 Group-Object時,Group-Object 會收到代表集合的一個物件。 因此,它會建立具有該對象作為其成員的單一群組。
若要將集合中的物件群組,請使用管線將 物件傳送至 Group-Object。
參數屬性
| 類型: | PSObject |
| 預設值: | None |
| 支援萬用字元: | False |
| 不要顯示: | False |
參數集
(All)
| Position: | Named |
| 必要: | False |
| 來自管線的值: | True |
| 來自管線按屬性名稱的值: | False |
| 來自剩餘引數的值: | False |
-NoElement
表示此 Cmdlet 會從結果中省略群組的成員。
參數屬性
| 類型: | SwitchParameter |
| 預設值: | False |
| 支援萬用字元: | False |
| 不要顯示: | False |
參數集
(All)
| Position: | Named |
| 必要: | False |
| 來自管線的值: | False |
| 來自管線按屬性名稱的值: | False |
| 來自剩餘引數的值: | False |
-Property
指定群組的屬性。 對象會根據指定屬性的值排列成群組。
Property 參數的值可以是新的計算屬性。 匯出屬性可以是腳本區塊或哈希表。 有效的鍵值組如下:
- 表達式 -
<string>或<script block>
如需詳細資訊,請參閱about_Calculated_Properties。
參數屬性
| 類型: | Object[] |
| 預設值: | None |
| 支援萬用字元: | False |
| 不要顯示: | False |
參數集
(All)
| Position: | 0 |
| 必要: | False |
| 來自管線的值: | False |
| 來自管線按屬性名稱的值: | False |
| 來自剩餘引數的值: | False |
CommonParameters
此 Cmdlet 支援一般參數:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 如需詳細資訊,請參閱 about_CommonParameters。
輸入
PSObject
您可以使用管線將任何物件傳送至 Group-Object。
輸出
Microsoft.PowerShell.Commands.GroupInfo or System.Collections.Hashtable
使用 AsHashTable 參數時, Group-Object 返回 Hashtable 物件。
否則,它會傳回 GroupInfo 物件。
備註
您可以使用格式化 Cmdlet 的 GroupBy 參數,例如 Format-Table 和 Format-List,將物件分組。 不同於 Group-Object,它會為每個屬性值建立具有數據列的單一數據表,GroupBy 參數會為每個屬性值建立數據表,其中每個具有屬性值的專案各有一個數據列。
Group-Object 不要求要分組的物件具有相同的 Microsoft .NET Core 類型。 對不同 .NET Core 類型的物件進行分組時, Group-Object 請使用以下規則:
相同的屬性名稱和類型。
如果物件具有具有指定名稱的屬性,並且屬性值具有相同的 .NET Core 類型,則使用用於相同類型物件的相同規則對屬性值進行分組。
相同的屬性名稱,不同類型的。
如果物件具有具有指定名稱的屬性,但屬性值在不同物件中具有不同的 .NET Core 類型,
Group-Object則使用該屬性首次出現的 .NET Core 類型作為該屬性組的 .NET Core 類型。 當物件具有具有不同類型的屬性時,屬性值會轉換成該群組的類型。 如果類型轉換失敗,物件就不會包含在群組中。遺漏屬性。
沒有指定屬性的物件無法分組。 未分組的物件會出現在最後一個 GroupInfo 中, 名為
AutomationNull.Value的群組中的物件輸出。