Sort-Object

按属性值对对象进行排序。

语法

Default (默认值)

Sort-Object
    [[-Property] <Object[]>]
    [-Descending]
    [-Unique]
    [-InputObject <psobject>]
    [-Culture <string>]
    [-CaseSensitive]
    [<CommonParameters>]

说明

Sort-Object cmdlet 根据对象属性值按升序或降序对对象进行排序。 如果命令中不包含排序属性,PowerShell 将使用默认排序属性。

可以按单个属性或多个属性对对象进行排序。 多个属性使用哈希表按升序、降序或排序顺序的组合进行排序。 属性将排序为区分大小写或不区分大小写。 使用 Unique 参数可消除输出中的重复项。

示例

示例 1:按名称对当前目录进行排序

此命令对目录中的文件和子目录进行排序。

PS> 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

Get-ChildItem cmdlet 从 Path 参数 C:\Test 指定的目录中获取文件和子目录。 对象将管道向下发送到 Sort-Object cmdlet。 Sort-Object 未指定属性,因此输出按默认排序属性 Name 排序。

示例 2:按文件长度对当前目录进行排序

此命令按升序显示当前目录中的文件。

PS> 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

Get-ChildItem cmdlet 从 Path 参数指定的目录中获取文件。 File 参数指定 Get-ChildItem 仅获取文件对象。 对象将管道向下发送到 Sort-Object cmdlet。 Sort-Object 使用 Length 参数按长度按升序对文件进行排序。

示例 3:按内存使用情况对进程进行排序

此示例根据工作集(WS)大小显示内存使用率最高的进程。

PS> 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

Get-Process cmdlet 获取计算机上运行的进程的列表。 进程对象将管道向下发送到 Sort-Object cmdlet。 Sort-Object 使用 属性 参数按 WS对对象进行排序。 对象将管道向下发送到 Select-Object cmdlet。 Select-Object 使用 Last 参数来指定最后五个对象,这些对象是 WS 使用率最高的对象

示例 4:按 ID 对 HistoryInfo 对象进行排序

此命令使用 Id 属性对 PowerShell 会话的 HistoryInfo 对象进行排序。 每个 PowerShell 会话都有自己的命令历史记录。

PS> 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\

Get-History cmdlet 从当前 PowerShell 会话中获取历史记录对象。 对象将管道向下发送到 Sort-Object cmdlet。 Sort-Object 使用 属性 参数按 Id对对象进行排序。降序 参数对从最新到最早的命令历史记录进行排序。

示例 5:使用哈希表按升序和降序对属性进行排序

此命令使用两个属性对对象进行排序,即 StatusDisplayName状态 按降序排序,DisplayName 按升序排序。

哈希表用于指定 属性 参数的值。 哈希表使用表达式来指定属性名称和排序顺序。 有关哈希表的详细信息,请参阅 about_Hash_Tables

哈希表中使用的 Status 属性是一个枚举属性。 有关详细信息,请参阅 ServiceControllerStatus

PS C:\> 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

Get-Service cmdlet 获取计算机上的服务列表。 服务对象将管道向下发送到 Sort-Object cmdlet。 Sort-Object 使用具有哈希表的 Property 参数来指定属性名称和排序顺序。 属性 参数按两个属性排序,Status 降序排序,DisplayName 升序排序。

状态 是一个枚举属性。 停止 的值为 1运行 的值为 4 降序 参数设置为 $True,以便在 停止 进程之前显示运行 进程DisplayName降序 参数设置为 $False 按字母顺序对显示名称进行排序。

示例 6:按时间跨度对文本文件进行排序

此命令按 CreationTimelastWriteTime之间的时间跨度按降序对文本文件进行排序。

PS> Get-ChildItem -Path C:\Test\*.txt | Sort-Object -Property @{Expression = {$_.CreationTime - $_.LastWriteTime}; Descending = $False} | 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 文件。 对象将管道向下发送到 Sort-Object cmdlet。 Sort-ObjectProperty 参数与哈希表一起使用,以确定 CreationTimeLastWriteTime 之间的每个文件时间跨度。 的 Descending 参数设置为 $False 按时间跨度从最长到最短的顺序排序。

示例 7:对文本文件中的名称进行排序

此示例演示如何从文本文件中对列表进行排序。 原始文件显示为未排序的列表。 Sort-Object 对内容进行排序,然后使用删除重复项的 Unique 参数对内容进行排序。

PS> Get-Content -Path C:\Test\ServerNames.txt
localhost
server01
server25
LOCALHOST
Server19
server3
localhost

PS> Get-Content -Path C:\Test\ServerNames.txt | Sort-Object
localhost
LOCALHOST
localhost
server01
Server19
server25
server3

PS> 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 包含未排序的计算机名称列表。 对象将管道向下发送到 Sort-Object cmdlet。 Sort-Object 按默认顺序按升序对列表进行排序。

cmdlet Get-Content 使用 Path 参数指定目录和文件名。 文件 ServerNames.txt 包含未排序的计算机名称列表。 对象将管道向下发送到 Sort-Object cmdlet。 Sort-Object 使用 唯一 参数删除重复的计算机名称。 列表按默认顺序进行排序,升序。

示例 8:将字符串排序为整数

此示例演示如何将包含字符串对象的文本文件排序为整数。 您可以沿管道 Get-Member 将每个命令发送到并验证对象是字符串还是整数。

PS> Get-Content -Path C:\Test\ProductId.txt | Sort-Object
0
1
12345
1500
2
2800
3500
4100
500
6200
77
88
99999

PS> Get-Content -Path C:\Test\ProductId.txt | ForEach-Object -Process {[int]$_} | Sort-Object
0
1
2
77
88
500
1500
2800
3500
4100
6200
12345
99999

cmdlet Get-Content 使用 Path 参数指定目录和文件名。 文件 ProductId.txt 包含未排序的产品编号列表。 字符串对象沿管道 Sort-Object 发送到 cmdlet。 Sort-Object 按升序对字符串对象进行排序。

cmdlet Get-Content 使用 Path 参数指定目录和文件名。 文件 ProductId.txt 包含未排序的产品编号列表。 字符串对象沿管道 ForEach-Object 发送到 cmdlet。 ForEach-Object 使用脚本块将字符串转换为整数。 在示例代码中,[int] 将字符串转换为整数,$_ 表示管道中每个字符串。 整数对象将管道向下发送到 Sort-Object cmdlet。 Sort-Object 按数值顺序对整数对象进行排序。

参数

-CaseSensitive

指示排序区分大小写。 默认情况下,排序不区分大小写。

参数属性

类型:SwitchParameter
默认值:Case-insensitive
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Culture

指定要用于排序的文化配置。 使用 Get-Culture 显示系统的区域性配置。

参数属性

类型:String
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Descending

指示 Sort-Object 按降序对对象进行排序。 默认值为升序。

若要使用不同的排序顺序对多个属性进行排序,请使用哈希表。 例如,使用哈希表,可以按升序对一个属性进行排序,按降序对另一个属性进行排序。

参数属性

类型:SwitchParameter
默认值:Ascending
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-InputObject

若要对对象进行排序,请将其向下发送到 Sort-Object。 如果使用 InputObject 参数提交项集合,Sort-Object 会收到一个表示集合的对象。 由于无法对一个对象进行排序, Sort-Object 因此返回整个集合不变。

参数属性

类型:PSObject
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:True
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Property

指定 Sort-Object 用于对对象进行排序的属性名称。 允许使用通配符。 根据属性值对对象进行排序。 如果未指定属性, Sort-Object 则根据对象类型的默认属性进行排序。

可以按升序、降序或排序顺序组合对多个属性进行排序。 指定多个属性时,对象按第一个属性进行排序。 如果多个对象对第一个属性具有相同的值,则这些对象按第二个属性进行排序。 此过程将继续执行,直到没有更多的指定属性或没有对象组。

属性 参数的值可以是计算属性。 若要创建计算属性,请使用哈希表。

哈希表的有效键如下所示:

  • 表达式 <字符串> 或 <脚本块>
  • Ascending Boolean (升序 <布尔值)>
  • 布尔值降序<>

参数属性

类型:

Object[]

默认值:Default properties
支持通配符:True
不显示:False

参数集

(All)
Position:0
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Unique

指示 Sort-Object 消除重复项,并仅返回集合的唯一成员。 唯一值的第一个实例包含在排序的输出中。

唯一 不区分大小写。 仅按字符大小写不同的字符串被视为相同。 例如,字符和 CHARACTER。

参数属性

类型:SwitchParameter
默认值:All
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

CommonParameters

此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters

输入

PSObject

您可以通过管道将要排序的对象传输到 Sort-Object

输出

PSObject

Sort-Object 返回已排序的对象。

备注

Sort-Object cmdlet 根据命令中指定的属性或对象类型的默认排序属性对对象进行排序。 如果对象没有指定的属性之一,则该对象的属性值将解释 Sort-ObjectNull 并放置在排序顺序的末尾。

Sort-Object 对每个属性使用 Compare 方法。 如果属性未实现 IComparable,则 cmdlet 会将属性值转换为字符串,并使用 System.StringCompare 方法。 有关详细信息,请参阅 PSObject.CompareTo(Object) 方法

如果对枚举属性(如 状态)进行排序,Sort-Object 按枚举值排序。 停止 的值为 1运行 的值为 4 。 由于枚举值,运行 之前,已停止 排序。 有关详细信息,请参阅 ServiceControllerStatus