Sort-Object

依屬性值排序物件。

Syntax

Sort-Object
    [-Stable]
    [-Descending]
    [-Unique]
    [-InputObject <PSObject>]
    [[-Property] <Object[]>]
    [-Culture <String>]
    [-CaseSensitive]
    [<CommonParameters>]
Sort-Object
    [-Descending]
    [-Unique]
    -Top <Int32>
    [-InputObject <PSObject>]
    [[-Property] <Object[]>]
    [-Culture <String>]
    [-CaseSensitive]
    [<CommonParameters>]
Sort-Object
    [-Descending]
    [-Unique]
    -Bottom <Int32>
    [-InputObject <PSObject>]
    [[-Property] <Object[]>]
    [-Culture <String>]
    [-CaseSensitive]
    [<CommonParameters>]

Description

Cmdlet 會 Sort-Object 根據物件屬性值,以遞增或遞減順序排序物件。 如果命令中未包含排序屬性,PowerShell 會使用第一個輸入對象的預設排序屬性。 如果輸入對象的類型沒有預設的排序屬性,PowerShell 會嘗試比較物件本身。 如需詳細資訊,請參閱 附注 一節。

您可以依單一屬性或多個屬性排序物件。 多個屬性會使用哈希表,以遞增順序、遞減順序或排序順序的組合排序。 屬性會排序為區分大小寫或不區分大小寫。 使用 Unique 參數從輸出中移除重複專案。

範例

範例 1:依名稱排序目前目錄

此範例會排序目錄中的檔案和子目錄。

Get-ChildItem -Path C:\Test | Sort-Object

Directory: C:\Test

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2/13/2019     08:55             26 anotherfile.txt
-a----        2/13/2019     13:26             20 Bfile.txt
-a----        2/12/2019     15:40         118014 Command.txt
-a----         2/1/2019     08:43            183 CreateTestFile.ps1
d-----        2/25/2019     18:25                Files
d-----        2/25/2019     18:24                Logs
-ar---        2/12/2019     14:31             27 ReadOnlyFile.txt
-a----        2/12/2019     16:24             23 Zsystemlog.log

Cmdlet Get-ChildItem 會從 Path 參數所指定的目錄中取得檔案和子目錄。 C:\Test 物件會向下傳送至 Cmdlet 的 Sort-Object 管線。 Sort-Object不會指定屬性,因此輸出會依預設排序屬性 Name 排序。

範例 2:依檔案長度排序目前目錄

此命令會以遞增順序顯示目前目錄中的檔案。

Get-ChildItem -Path C:\Test -File | Sort-Object -Property Length

Directory: C:\Test

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2/13/2019     13:26             20 Bfile.txt
-a----        2/12/2019     16:24             23 Zsystemlog.log
-a----        2/13/2019     08:55             26 anotherfile.txt
-ar---        2/12/2019     14:31             27 ReadOnlyFile.txt
-a----         2/1/2019     08:43            183 CreateTestFile.ps1
-a----        2/12/2019     15:40         118014 Command.txt

Cmdlet Get-ChildItem 會從Path參數所指定的目錄取得檔案。 File 參數指定Get-ChildItem只取得檔案物件。 物件會向下傳送至 Cmdlet 的 Sort-Object 管線。 Sort-Object會使用 Length 參數,以遞增順序排序檔案。

範例 3:依記憶體使用量排序進程

此範例會根據其工作集 (WS) 大小,顯示記憶體使用量最高的進程。

Get-Process | Sort-Object -Property WS | Select-Object -Last 5

NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
    136   193.92     217.11     889.16   87492   8 OUTLOOK
    112   347.73     297.02      95.19  106908   8 Teams
    206   266.54     323.71      37.17   60620   8 MicrosoftEdgeCP
     35   552.19     549.94     131.66    6552   8 Code
      0     1.43     595.12       0.00    2780   0 Memory Compression

Cmdlet Get-Process 會取得電腦上執行的進程清單。 進程物件會從管線向下傳送至 Sort-Object Cmdlet。 Sort-Object會使用 Property 參數依 WS 排序物件。 物件會向下傳送至 Cmdlet 的 Select-Object 管線。 Select-Object使用 Last 參數來指定最後五個物件,也就是具有最高 WS 使用方式的物件。

在 PowerShell 6 中Sort-Object,Bottom 參數是 的替代方法Select-Object。 例如: Get-Process | Sort-Object -Property WS -Bottom 5

範例 4:依標識符排序 HistoryInfo 物件

此命令會使用Id屬性來排序PowerShell會話的 HistoryInfo 物件。 每個 PowerShell 會話都有自己的命令歷程記錄。

Get-History | Sort-Object -Property Id -Descending

Id CommandLine
  -- -----------
  10 Get-Command Sort-Object -Syntax
   9 $PSVersionTable
   8 Get-Command Sort-Object -Syntax
   7 Get-Command Sort-Object -ShowCommandInfo
   6 Get-ChildItem -Path C:\Test | Sort-Object -Property Length
   5 Get-Help Clear-History -online
   4 Get-Help Clear-History -full
   3 Get-ChildItem | Get-Member
   2 Get-Command Sort-Object -Syntax
   1 Set-Location C:\Test\

Cmdlet Get-History 會從目前的PowerShell工作階段取得歷程記錄物件。 物件會向下傳送至 Cmdlet 的 Sort-Object 管線。 Sort-Object會使用 Property 參數依標識符排序物件。遞參數會將命令歷程記錄從最新到最舊排序。

範例 5:使用哈希表以遞增和遞減順序排序屬性

此範例使用兩個屬性來排序物件 StatusDisplayName狀態 會依遞減順序排序,而 DisplayName 會依遞增順序排序。

哈希表用來指定 Property 參數的值。 哈希表會使用表示式來指定屬性名稱和排序順序。 如需有關雜湊表的詳細資訊,請參閱 about_Hash_Tables

哈希表中所使用的 Status 屬性是列舉屬性。 如需詳細資訊,請參閱 ServiceControllerStatus

Get-Service |
    Sort-Object -Property @{Expression = "Status"; Descending = $true},
                          @{Expression = "DisplayName"; Descending = $false}

Status   Name               DisplayName
------   ----               -----------
Running  Appinfo            Application Information
Running  BthAvctpSvc        AVCTP service
Running  BrokerInfrastru... Background Tasks Infrastructure Ser...
Running  BDESVC             BitLocker Drive Encryption Service
Running  CoreMessagingRe... CoreMessaging
Running  VaultSvc           Credential Manager
Running  DsSvc              Data Sharing Service
Running  Dhcp               DHCP Client
...
Stopped  ALG                Application Layer Gateway Service
Stopped  AppMgmt            Application Management
Stopped  BITS               Background Intelligent Transfer Ser...
Stopped  wbengine           Block Level Backup Engine Service
Stopped  BluetoothUserSe... Bluetooth User Support Service_14fb...
Stopped  COMSysApp          COM+ System Application
Stopped  smstsmgr           ConfigMgr Task Sequence Agent
Stopped  DeviceInstall      Device Install Service
Stopped  MSDTC              Distributed Transaction Coordinator

Cmdlet Get-Service 會取得電腦上的服務清單。 服務物件會從管線向下傳送至 Sort-Object Cmdlet。 Sort-Object使用 Property 參數搭配哈希表來指定屬性名稱和排序順序。 Property 參數依兩個屬性排序:Status 遞減順序和 DisplayName 遞增順序。

Status 是列舉屬性。 Stopped 的值 為 1 ,而 Running 的值為 4。 Descending 參數會設定為 $True讓執行中的進程顯示在 [已停止的進程] 之前 DisplayName 會將 Descending 參數設定為 $False ,以字母順序排序顯示名稱。

範例 6:依時間範圍排序文字檔

此命令會依 CreationTime 與 LastWriteTime 之間的時間範圍,依遞減順序排序文本檔。

Get-ChildItem -Path C:\Test\*.txt |
    Sort-Object -Property {$_.CreationTime - $_.LastWriteTime} |
    Format-Table CreationTime, LastWriteTime, FullName

CreationTime          LastWriteTime        FullName
------------          -------------        --------
11/21/2018 12:39:01   2/26/2019 08:59:36   C:\Test\test2.txt
12/4/2018 08:29:41    2/26/2019 08:57:05   C:\Test\powershell_list.txt
2/20/2019 08:15:59    2/26/2019 12:09:43   C:\Test\CreateTestFile.txt
2/20/2019 08:15:59    2/26/2019 12:07:41   C:\Test\Command.txt
2/20/2019 08:15:59    2/26/2019 08:57:52   C:\Test\ReadOnlyFile.txt
11/29/2018 15:16:50   12/4/2018 16:16:24   C:\Test\LogData.txt
2/25/2019 18:25:11    2/26/2019 12:08:47   C:\Test\Zsystemlog.txt
2/25/2019 18:25:11    2/26/2019 08:55:33   C:\Test\Bfile.txt
2/26/2019 08:46:59    2/26/2019 12:12:19   C:\Test\LogFile3.txt

Cmdlet Get-ChildItem 會使用 Path 參數來指定目錄 C:\Test 和所有 *.txt 檔案。 物件會向下傳送至 Cmdlet 的 Sort-Object 管線。 Sort-Object使用 Property 參數搭配 scriptblock 來判斷 CreationTimeLastWriteTime 之間的每個檔案時間範圍。

範例 7:排序文字檔中的名稱

此範例示範如何從文本檔排序列表。 源檔會顯示為未排序的清單。 Sort-Object會排序內容,然後使用移除重複專案的唯一參數來排序內容

# All items unsorted
Get-Content -Path C:\Test\ServerNames.txt

localhost
server01
server25
LOCALHOST
Server19
server3
localhost

# All items sorted
Get-Content -Path C:\Test\ServerNames.txt | Sort-Object
localhost
LOCALHOST
localhost
server01
Server19
server25
server3

# Unique filtered items sorted
Get-Content -Path C:\Test\ServerNames.txt | Sort-Object -Unique

localhost
server01
Server19
server25
server3

Cmdlet Get-Content 會使用 Path 參數來指定目錄和檔名。 檔案 ServerNames.txt 包含未排序的計算機名稱清單。

Cmdlet Get-Content 會使用 Path 參數來指定目錄和檔名。 檔案 ServerNames.txt 包含未排序的計算機名稱清單。 物件會向下傳送至 Cmdlet 的 Sort-Object 管線。 Sort-Object 依預設順序排序列表,遞增。

Cmdlet Get-Content 會使用 Path 參數來指定目錄和檔名。 檔案 ServerNames.txt 包含未排序的計算機名稱清單。 物件會向下傳送至 Cmdlet 的 Sort-Object 管線。 Sort-Object會使用 Unique 參數來移除重複的電腦名稱。 清單會依預設順序以遞增排序。

範例 8:將字串排序為整數

此範例示範如何將包含字串物件的文字檔排序為整數。 您可以將每個命令傳送至 管線, Get-Member 並確認對像是字串,而不是整數。 針對這些範例, ProductId.txt 檔案包含未排序的產品名稱清單。

在第一個範例中, Get-Content 取得檔案的內容,並將管線傳送至 Sort-Object Cmdlet。 Sort-Object 會以遞增順序排序字串物件。

# String sorted
Get-Content -Path C:\Test\ProductId.txt | Sort-Object

0
1
12345
1500
2
2800
3500
4100
500
6200
77
88
99999

# Integer sorted
Get-Content -Path C:\Test\ProductId.txt | Sort-Object {[int]$_}

0
1
2
77
88
500
1500
2800
3500
4100
6200
12345
99999

在第二個範例中, Get-Content 取得檔案的內容,並將管線傳送至 Sort-Object Cmdlet。 Sort-Object 會使用腳本區塊將字串轉換成整數。 在範例程式代碼中, [int] 將字串轉換成整數,並在 $_ 管線下時代表每個字串。 整數物件會從管線向下傳送至 Sort-Object Cmdlet。 Sort-Object 以數值順序排序整數物件。

範例 9:使用穩定排序

當您使用 Top、BottomStable 參數時,排序的物件會依照排序準則相等時收到Sort-Object的順序來傳遞。 在此範例中,我們會依其值 『modulo 3』 來排序第一到 20 的數位。 模數值的範圍從零到兩個。

1..20 |Sort-Object {$_ % 3}

18
3
15
6
12
9
1
16
13
10
7
4
19
11
8
14
5
17
2
20

1..20 |Sort-Object {$_ % 3} -Stable

3
6
9
12
15
18
1
4
7
10
13
16
19
2
5
8
11
14
17
20

第一個排序的輸出會依模數值正確分組,但個別專案不會在模數範圍內排序。 第二個排序會使用 Stable 選項傳回穩定排序。

範例 10:依多個屬性排序

如果您想要依多個屬性排序,請以逗號分隔屬性。

Get-ChildItem -Path C:\Test | Sort-Object Length,Name

Directory: C:\Test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          13/10/2021    22:16              2 File01.txt
-a---          13/10/2021    22:16              2 File03.txt
-a---          13/10/2021    22:18             64 File02.txt
-a---          13/10/2021    22:18             64 File04.txt

Cmdlet Get-ChildItem 會從Path參數所指定的目錄取得檔案。 物件會向下傳送至 Cmdlet 的 Sort-Object 管線。 Sort-Object會使用 LengthName 參數,以遞增順序依長度排序檔案。 由於 File01.txtFile03.txt 具有相同長度,因此會依其屬性 Name 進一步排序。

範例 11:依索引鍵值排序哈希表

從 PowerShell 6 開始, Sort-Object 支援依索引鍵值排序 哈希表 輸入。 下列範例會依每個哈希表索引 weight 鍵的值來排序哈希表的陣列。

@(
    @{ name = 'a' ; weight = 7 }
    @{ name = 'b' ; weight = 1 }
    @{ name = 'c' ; weight = 3 }
    @{ name = 'd' ; weight = 7 }
) | Sort-Object -Property weight -OutVariable Sorted

$Sorted | ForEach-Object -Process { "{0}: {1}" -f $_.name, $_.weight }

Name                           Value
----                           -----
Weight                         1
Name                           b
Weight                         3
Name                           c
Weight                         7
Name                           a
Weight                         7
Name                           d

b: 1
c: 3
a: 7
d: 7

參數

-Bottom

指定要從已排序物件陣列結尾取得的物件數目。 這會產生穩定的排序。

此參數是在 PowerShell 6.0 中引進的。

Type:Int32
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CaseSensitive

表示排序區分大小寫。 根據預設,排序不會區分大小寫。

Type:SwitchParameter
Position:Named
Default value:Case-insensitive
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

指定要用於排序的文化特性組態。 使用 Get-Culture 來顯示系統的文化特性設定。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Descending

Sort-Object表示以遞減順序排序物件。 預設值為遞增順序。

若要排序具有不同排序順序的多個屬性,請使用哈希表。 例如,使用哈希表,您可以依遞增順序排序一個屬性,並以遞減順序排序另一個屬性。

Type:SwitchParameter
Position:Named
Default value:Ascending
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

若要排序物件,請將管線向下傳送至 Sort-Object。 如果您使用 InputObject 參數來提交專案的集合, Sort-Object 則會收到代表集合的一個物件。 因為無法排序某個物件,因此 Sort-Object 會傳回整個集合不變。

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Property

指定用來排序物件的屬性名稱 Sort-Object 。 允許通配符。 對象會根據屬性值排序。 如果您未指定屬性, Sort-Object 請根據物件類型或物件本身的預設屬性排序。

使用逗號分隔多個屬性。 多個屬性可以遞增順序、遞減順序或排序順序的組合來排序。 當您指定多個屬性時,物件會依第一個屬性排序。 如果多個物件具有第一個屬性相同的值,這些物件會依第二個屬性排序。 此程式會繼續執行,直到沒有指定的屬性或沒有物件群組為止。

Property 參數的值可以是導出屬性。 若要建立導出屬性,請使用 scriptblock 或哈希表。

哈希表的有效索引鍵如下所示:

  • expression - <string><script block>
  • ascendingdescending - <boolean>

如需詳細資訊,請參閱 about_Calculated_Properties

Type:Object[]
Position:0
Default value:Default properties
Required:False
Accept pipeline input:False
Accept wildcard characters:True

-Stable

排序物件會依照排序準則相等時收到的順序來傳遞。

此參數已在 PowerShell v6.2.0 中新增。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Top

指定要從排序物件陣列開頭取得的物件數目。 這會產生穩定的排序。

此參數是在 PowerShell 6.0 中引進的。

Type:Int32
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Unique

表示 Sort-Object 排除重複專案,並只傳回集合的唯一成員。 唯一值的第一個實例會包含在排序的輸出中。

一不區分大小寫。 只有字元大小寫不同的字串會視為相同。 例如,字元和 CHARACTER。

Type:SwitchParameter
Position:Named
Default value:All
Required:False
Accept pipeline input:False
Accept wildcard characters:False

輸入

PSObject

您可以使用管線將物件傳送至這個 Cmdlet。

輸出

PSObject

此 Cmdlet 會傳回已排序的物件。

備註

PowerShell 包含下列的 Sort-Object別名:

  • Windows:
    • sort

Cmdlet 會 Sort-Object 根據命令中指定的屬性或物件類型的預設排序屬性來排序物件。 默認排序屬性是使用 PropertySet 檔案中具名 DefaultKeyPropertySettypes.ps1xml 來定義。 如需詳細資訊,請參閱 about_Types.ps1xml

如果對象沒有其中一個指定的屬性,該對象的屬性值會解譯 Sort-ObjectNull ,並放在排序順序的結尾。

當沒有可用的排序屬性時,PowerShell 會嘗試比較物件本身。 Sort-Object會針對每個屬性使用 Compare 方法。 如果屬性未實作 IComparable,Cmdlet 會將屬性值轉換成字串,並使用 System.StringCompare 方法。 如需詳細資訊,請參閱 PSObject.CompareTo(Object) 方法

如果您排序列舉屬性,例如 StatusSort-Object 則依列舉值排序。 若為 Windows 服務, Stopped 的值為 1 ,而 [執行] 的 值為 4已停止會先排序執行之前,因為列舉值。 如需詳細資訊,請參閱 ServiceControllerStatus

執行穩定排序時,排序演算法的效能較慢。