Group-Object
將指定的屬性含有相同屬性值的物件歸為群組。
語法
Group-Object [-AsHashTable] [-AsString] [[-Property] <Object[]>] [-CaseSensitive] [-Culture <string>] [-InputObject <psobject>] [-NoElement] [<CommonParameters>]
描述
Group-Object Cmdlet 會根據指定的屬性值來分組顯示的物件。Group-Object 會傳回一個表格,其中每個屬性值各為一列,而欄則顯示有該值的項目數。
如果您指定一個以上的屬性,Group-Object 會先依據第一個屬性的值進行分組,然後在每個屬性群組內再依據下一個屬性的值進行分組。
參數
-AsHashTable
以雜湊表形式傳回群組。雜湊表的索引鍵是分組物件所依據的屬性值,而雜湊表的值則是有該屬性值的物件。
AsHashTable 參數會自行傳回每個雜湊表,當中每個索引鍵都是分組物件的執行個體。此參數與 AsString 參數搭配使用時,雜湊表中的索引鍵會是字串。
必要? |
false |
位置? |
named |
預設值 |
GroupInfo 物件 |
接受管線輸入? |
false |
接受萬用字元? |
false |
-AsString
將雜湊表索引鍵轉換成字串。根據預設,雜湊表索引鍵是分組物件的執行個體。此參數只有與 AsHashTable 參數搭配使用時才有效。
必要? |
false |
位置? |
named |
預設值 |
GroupInfo 物件 |
接受管線輸入? |
false |
接受萬用字元? |
false |
-CaseSensitive
讓分組有大小寫之分。若沒有此參數,物件的屬性值在群組中可能會有不同的大小寫。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Culture <string>
指定比較字串時所要使用的文化特性。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-InputObject <psobject>
指定要分組的物件。請輸入包含物件的變數,或輸入可取得物件的命令或運算式。
當您使用 InputObject 參數將物件的集合送出給 Group-Object 時,Group-Object 會接收一個代表集合的物件,因此它會建立一個有該物件的群組做為其成員。
若要將集合中的物件進行分組,請經由管道將物件輸出至 Group-Object。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
true (ByValue) |
接受萬用字元? |
false |
-NoElement
將群組的成員從結果中省略。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Property <Object[]>
指定分組的屬性。物件將會依照指定的屬性值進行分組。
Property 參數的值可以是新的計算屬性。若要建立計算屬性,請建立一個包含 Expression 索引鍵的雜湊表,此索引鍵會指定字串或指令碼區塊值。
必要? |
false |
位置? |
1 |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
<CommonParameters>
這個 Cmdlet 支援一般參數:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。如需詳細資訊,請參閱 about_Commonparameters.
輸入和輸出
輸入型別是可經由管道輸出至 Cmdlet 的物件型別。傳回型別則是 Cmdlet 所傳回的物件型別。
輸入 |
System.Management.Automation.PSObject 您可經由管道將任何物件輸出至 Group-Object |
輸出 |
Microsoft.PowerShell.Commands.GroupInfo 或 System.Collections.Hashtable 當您使用 AsHashTable 參數時,Group-Object 會傳回雜湊表。否則,它會傳回 GroupInfo 物件。 |
附註
您也可以使用格式化 Cmdlet (例如 Format-Table [m2] 和 Format-List [m2]) 的 GroupBy 參數來分組物件。不像 Group-Object 在建立每個屬性值各為一列的單一表格時,GroupBy 參數會為每個屬性值各建立一個表格,其中每一個有屬性值的項目各為一列。
Group-Object 不要求分組的物件必須屬於相同 Microsoft .NET Framework 型別。對不同 .NET Framework 型別的物件進行分組時,Group-Object 會使用下列規則:
-- 屬性名稱和型別都相同:如果物件的屬性有指定的名稱,而且屬性值有相同的 .NET Framework 型別,則會以相同的規則 (用於相同型別的物件) 來分組屬性值。
-- 屬性名稱相同但型別不同:如果物件的屬性有指定的名稱,但是屬性值在不同的物件中各有不同的 .NET Framework 型別,則 Group-Object 會使用第一個出現之屬性的 .NET Framework 型別做為該屬性群組的 .NET Framework 型別。當物件有不同型別的屬性時,Group-Object 會將屬性值轉換成該群組的型別。如果型別轉換失敗,則不會將物件列入該群組。
-- 缺少屬性:沒有指定屬性的物件視為不可分組。不可分組物件會在名為 AutomationNull.Value 群組的最終 GroupInfo 物件輸出中出現。
範例 1
C:\PS>get-childitem *.doc | group-object -property length
描述
-----------
這個命令會取得目前位置中副檔名為 .doc 的檔案,然後依大小進行分組。
範例 2
C:\PS>get-childitem | sort-object -property extension | group-object -property extension
描述
-----------
這個命令會取得目前位置中的檔案,然後依副檔名排序檔案,再依副檔名進行分組。請注意,先排序再分組檔案。
範例 3
C:\PS>1..35 | group-object -property {$_ % 2},{$_ % 3}
描述
-----------
這個範例示範如何使用指令碼區塊做為 Property 參數的值。
這個命令會顯示從 1 到 35 的整數,並依據除以 2 或 3 所得之餘數來分組。
範例 4
C:\PS>$events = get-eventlog -logname system -newest 1000
C:\PS> $events | group-object -property eventID
Count Name Group
----- ---- -----
44 Information {System.Diagnostics.EventLogEntry,
5 Error {System.Diagnostics.EventLogEntry,
1 Warning {System.Diagnostics.EventLogEntry}
描述
-----------
這些命令會顯示系統事件記錄檔中最新的 1,000 個項目,並依據事件識別碼進行分組。
第一個命令會使用 Get-EventLog Cmdlet 擷取事件,並使用指派運算子 (=) 將這些事件儲存到 $events 變數。
第二個命令會使用管線運算子 (|) 將 $events 變數中事件傳送給 Group-Object Cmdlet,並使用 Property 參數指定事件應該依據 EventID 屬性的值進行分組。
在輸出中,Count 欄代表每個群組中的項目數、Name 欄代表 EventID 值 (每個值各定義一個群組),而 Group 欄則代表每個群組中的物件。
範例 5
C:\PS>get-process | group-object -property priorityclass
Count Name Group
----- ---- -----
55 Normal {System.Diagnostics.Process (AdtAgent), System.Diagnostics.Process (alg), System.Dia...
1 {System.Diagnostics.Process (Idle)}
3 High {System.Diagnostics.Process (Newproc), System.Diagnostics.Process (winlogon), System.D...
2 BelowNormal {System.Diagnostics.Process (winperf),
C:\PS>get-process | group-object -property company -noelement
Count Name
----- ----
55 Normal
1
3 High
2 BelowNormal
描述
-----------
這個範例示範 NoElement 參數的效果。這些命令會依據優先類別將電腦上的處理序進行分組。
第一個命令會使用 Get-Process Cmdlet 取得電腦上的處理序,並使用管線運算子 (|) 將結果傳送給 Group-Object,讓後者依照處理序的 PriorityClass 屬性值來分組物件。
第二個命令會使用 NoElement 參數將群組的成員從結果中排除,除這點以外與第一個命令無異。結果為一個只有計數和屬性名稱的表格。
下列範例的輸出會顯示結果。
範例 6
C:\PS>get-eventlog -logname system -newest 1000 | group-object -property {$_.TimeWritten - $_.TimeGenerated}
描述
-----------
這個命令示範如何提供 Property 參數的值做為指令碼區塊。
這個命令顯示系統事件記錄檔中最新的 1,000 個項目,並依據從產生項目到寫入記錄檔的期間加以分組。
此命令會使用 Get-EventLog Cmdlet 取得事件記錄檔項目。它會使用管線運算子 (|) 傳送項目給 Group-Object Cmdlet。Property 參數值被指定為指令碼區塊 (大括號內的運算式)。指令碼區塊評估所得結果為產生日誌項目與此項目寫入日誌之間的期間。這個值會用來將 1000 個最新的事件分組。
範例 7
C:\PS>get-childitem | group-object extension -noelement
Count Name
----- ----
21
82 .txt
9 .cmd
5 .log
12 .xml
5 .htm
36 .ps1
1 .psc1
3 .exe
6 .csv
1 .psd1
2 .bat
描述
-----------
這個命令會依據副檔名將目前目錄中的項目進行分組,並使用 NoElement 省略群組的成員。
下列範例的輸出會顯示結果。
範例 8
C:\PS>"a", "b", "c", "c", "d" | get-unique
a
b
c
d
C:\PS> "a", "b", "c", "c", "d" | group-object -noelement | where {$_.Count -gt 1}
Count Name
----- ----
2 c
C:\PS> get-process | group-object -property Name -noelement | where {$_.count -gt 1}
Count Name
----- ----
2 csrss
5 svchost
2 winlogon
2 wmiprvse
描述
-----------
這個範例示範如何找出集合中唯一的和非唯一的 (重複的) 屬性值。
第一個命令會經由管道將陣列輸出至 Get-Unique Cmdlet,以取得陣列的唯一的元素。
第二個命令會取得陣列的非唯一元素,並經由管道將陣列輸出至 Group-Object Cmdlet,讓後者依據值來分組物件。產生的群組會經由管道輸出至 Where-Object Cmdlet,讓後者選取有一個以上的群組成員的物件。
第三個命令示範這項技巧的實用用途,並以相同方法來找出電腦上同名的處理序。
下列範例的輸出會顯示結果。
範例 9
C:\PS>$a = get-command get-*, set-* -type cmdlet | group-object -property verb -ashashtable -asstring
C:\PS> $a
Name Value
---- -----
Get {Get-PSCallStack, Get-PSBreakpoint, Get-PSDrive, Get-PSSession...}
Set {Set-Service, Set-StrictMode, Set-PSDebug, Set-PSSessionConfiguration...}
C:\PS> $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 和 AsString 參數,以雜湊表形式 (也就是以索引鍵值組的集合形式) 傳回群組。
在產生的雜湊表中,每個屬性值都是一個索引鍵,而群組元素則為值。因為每個索引鍵都是雜湊表物件的屬性,您可以使用點標記法來顯示值。
第一個命令會取得工作階段中的 Get 和 Set Cmdlet,接著依據動詞進行分組,然後以雜湊表形式傳回群組,再將雜湊表儲存到 $a 變數。
第二個命令會顯示 $a 中的雜湊表。索引鍵值組有兩組,一組用於 Get Cmdlet,另一組用於 Set Cmdlet。
第三個命令會以點標記法來顯示 $a 中 Get 索引鍵的值。這些值為 CmdletInfo 物件。AsString 參數並不會將群組中的物件轉換成字串。