Group-Object
將包含指定屬性相同值的物件分組。
語法
Group-Object
[-NoElement]
[-AsHashTable]
[-AsString]
[-InputObject <PSObject>]
[[-Property] <Object[]>]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Description
Cmdlet 會 Group-Object
根據指定屬性的值,在群組中顯示物件。
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 0 {2, 4, 6, 8...}
10 1 {1, 3, 5, 7...}
範例 3:依 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...}
範例 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
顯示 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 3.0.0.0 Microsoft.PowerShell.Security
Cmdlet Get-Alias 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-AppLockerFileInformation 2.0.0.0 AppLocker
Cmdlet Get-AppLockerPolicy 2.0.0.0 AppLocker
...
範例 10:使用匯出屬性分組哈希表的索引鍵值
此範例示範如何依索引鍵的值將哈希表物件分組。 您可以為 Property 參數指定一或多個腳本區塊。 這些腳本區塊中的表達式可用來分組輸入,例如具名屬性的值。
@(
@{ name = 'a' ; weight = 7 }
@{ name = 'b' ; weight = 1 }
@{ name = 'c' ; weight = 3 }
@{ name = 'd' ; weight = 7 }
) | Group-Object -Property { $_.weight } -NoElement
Count Name
----- ----
2 7
1 1
1 3
參數
-AsHashTable
指出此 Cmdlet 會將群組當做哈希表傳回。 哈希表的索引鍵是物件分組的屬性值。 哈希表的值是具有該屬性值的物件。
AsHashTable 參數本身會傳回每個哈希表,其中每個索引鍵都是群組對象的實例。 搭配 AsString 參數使用時,哈希表中的索引鍵是字串。
類型: | SwitchParameter |
別名: | AHT |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-AsString
指出這個 Cmdlet 會將哈希表索引鍵轉換成字串。 根據預設,哈希表索引鍵是群組對象的實例。 此參數只有在搭配 AsHashTable 參數使用時才有效。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-CaseSensitive
表示此 Cmdlet 會區分大小寫。 如果沒有此參數,群組中對象的屬性值可能會有不同的情況。
類型: | SwitchParameter |
Position: | Named |
預設值: | False |
必要: | 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 |
預設值: | False |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Property
指定群組的屬性。 對象會根據指定屬性的值排列成具名群組。 未指定任何屬性時,物件會依其值或 ToString()
其值的表示來分組。 輸出會依建立群組對象的順序呈現。
Property 參數的值可以是新的導出屬性。 匯出屬性可以是腳本區塊或哈希表。 有效的機碼/值組如下:
- 表達式 -
<string>
或<script block>
如需詳細資訊,請參閱 about_Calculated_Properties。
類型: | Object[] |
Position: | 0 |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
輸入
您可以使用管線將任何物件傳送至此 Cmdlet。
輸出
根據預設,此 Cmdlet 會 傳回 GroupInfo 物件。
當您使用 AsHashTable 參數時,這個 Cmdlet 會 傳回 Hashtable 物件。
備註
Windows PowerShell 包含下列的 Group-Object
別名:
group
您可以使用 格式化 Cmdlet 的 GroupBy 參數,例如 Format-Table
和 Format-List
,將物件分組。 不同於 Group-Object
,它會為每個屬性值建立具有數據列的單一數據表, GroupBy 參數會為每個具有屬性值的專案建立一個數據列的數據表。
Group-Object
不需要群組的物件與 .NET 類型相同Microsoft。
將不同 .NET 類型的物件分組時, Group-Object
會使用下列規則:
相同的屬性名稱和類型。
如果物件具有具有指定名稱的屬性,而屬性值具有相同的 .NET 類型,則屬性值會依相同類型物件所使用的相同規則分組。
相同的屬性名稱,不同類型的。
如果物件具有具有指定名稱的屬性,但屬性值在不同物件中有不同的 .NET 類型,
Group-Object
請使用屬性第一次出現的 .NET 類型做為該屬性群組的 .NET 類型。 當物件具有具有不同類型的屬性時,屬性值會轉換成該群組的類型。 如果類型轉換失敗,物件就不會包含在群組中。遺漏屬性。
沒有指定屬性的物件無法分組。 未分組的物件會出現在名為
AutomationNull.Value
的群組中最後一個 GroupInfo 物件輸出中。
輸出群組會依建立群組的順序呈現。 屬於每個群組的專案不會排序。 它們會依收到的順序列出。