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:群組哈希表中的物件
這個範例會使用 AsHashTable 和 AsString 參數來傳回哈希表中的群組,也就是索引鍵/值組的集合。
在產生的哈希表中,每個屬性值都是索引鍵,而群組元素則是值。 因為每個索引鍵都是哈希表對象的屬性,因此您可以使用點表示法來顯示值。
第一個命令會取得會話中的 Get
和 Set
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 |
輸入
您可以使用管線將任何物件傳送至 Group-Object
。
輸出
Microsoft.PowerShell.Commands.GroupInfo or System.Collections.Hashtable
當您使用 AsHashTable 參數時,Group-Object
會傳回哈希表。
否則,它會傳回 GroupInfo 物件。
備註
您也可以使用格式化 Cmdlet 的 GroupBy 參數來群組物件,例如
Format-Table
和Format-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
的群組中對象輸出。