Sort-Object
按照属性值对对象进行排序。
语法
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>]
说明
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
指定的目录获取文件和子目录。 对象在管道中向下发送到 Sort-Object
cmdlet。
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
仅获取文件对象。 对象在管道中向下发送到 Sort-Object
cmdlet。 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 对对象进行排序。 对象在管道中向下发送到 Select-Object
cmdlet。
Select-Object
使用 Last 参数指定最后五个对象,这些对象是 WS 使用率最高的对象。
在 PowerShell 6 中 Sort-Object
,参数 Bottom 是 的 Select-Object
替代方法。 例如 Get-Process | Sort-Object -Property WS -Bottom 5
。
示例 4:按 ID 对 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 会话获取历史记录对象。 对象在管道中向下发送到 Sort-Object
cmdlet。 Sort-Object
使用 Property 参数按 ID 对对象进行排序。 降序 参数将命令历史记录从最新到最旧进行排序。
示例 5:使用哈希表按升序和降序对属性进行排序
此示例使用两个属性对对象进行排序: Status 和 DisplayName。 状态 按降序排序, 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 参数按两个属性排序:状态降序和 DisplayName 升序。
Status 是枚举属性。 已停止 的值为 1 , 而“正在运行” 的值为 4。 将“降序”参数设置为 $True
,以便“正在运行的进程”显示在“已停止的进程”之前。 DisplayName 将 “降序” 参数设置为 $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
文件。 对象在管道中向下发送到 Sort-Object
cmdlet。
Sort-Object
使用具有 scriptblock 的 Property 参数来确定 CreationTime 和 LastWriteTime 之间的每个文件时间跨度。
示例 7:对文本文件中的名称进行排序
此示例演示如何从文本文件对列表进行排序。 原始文件显示为未排序的列表。 Sort-Object
对内容进行排序,然后使用删除重复项的 Unique 参数对内容进行排序。
# 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
包含未排序的计算机名称列表。 对象在管道中向下发送到 Sort-Object
cmdlet。 Sort-Object
按默认顺序(升序)对列表进行排序。
cmdlet Get-Content
使用 Path 参数指定目录和文件名。 该文件 ServerNames.txt
包含未排序的计算机名称列表。 对象在管道中向下发送到 Sort-Object
cmdlet。 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、 Bottom 或 Stable 参数时,排序对象将按照排序条件相等时接收 Sort-Object
它们的顺序传递。 在此示例中,我们将按其值“modulo 3”对数字 1 到 20 进行排序。 模值的范围为 0 到 2。
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
第一个排序的输出按模数值正确分组,但各个项不会在模数范围内进行排序。 第二个排序使用 “稳定” 选项返回稳定排序。
示例 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 参数指定的目录中获取文件。
对象在管道中向下发送到 Sort-Object
cmdlet。 Sort-Object
使用 Length 和 Name 参数按长度升序对文件进行排序。 由于 File01.txt
和 File03.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 参数的值可以是计算属性。 若要创建计算属性,请使用脚本块或哈希表。
哈希表的有效密钥如下所示:
expression
-<string>
或<script block>
ascending
或descending
-<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 和 CHARACTER。
Type: | SwitchParameter |
Position: | Named |
Default value: | All |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
输入
可以通过管道将对象排序到此 cmdlet。
输出
此 cmdlet 返回排序的对象。
备注
PowerShell 包含以下别名 Sort-Object
:
- Windows:
sort
cmdlet Sort-Object
根据命令中指定的属性或对象类型的默认排序属性对对象进行排序。 默认排序属性是在文件中使用 PropertySet
命名DefaultKeyPropertySet
的 定义。types.ps1xml
有关详细信息,请参阅 about_Types.ps1xml。
如果对象没有指定属性之一,则该对象的属性值将被 Sort-Object
解释为 Null ,并放置在排序顺序的末尾。
如果没有可用的排序属性,PowerShell 会尝试比较对象本身。
Sort-Object
为每个属性使用 Compare 方法。 如果属性未实现 IComparable,则 cmdlet 会将属性值转换为字符串,并使用 System.String 的 Compare 方法。 有关详细信息,请参阅 PSObject.CompareTo (Object) 方法。
如果对枚举属性(如 Status)进行排序, Sort-Object
则按枚举值排序。 对于 Windows 服务, “已停止” 的值为 1 , 而“正在运行” 的值为 4。
由于枚举值,停止在运行之前排序。 有关详细信息,请参阅 ServiceControllerStatus。
执行稳定排序时,排序算法的性能较慢。