搞懂了PowerShell中的Sort-Object 1


本周,我再发一篇关于PowerShell 的探讨。我在管道中使用Sort-Object时,遇到了一个很有趣的现象,现在分享给你们。

你可能已经知道了,可以使用Sort-Object在管道中给你的对象排序。就让我们把从命令Get-Service中返回的对象按照属性Name简单的升序排列。

Get-Service | Sort-Object -Property Name | Format-Table Name, Status -AutoSize

按照服务的名称升序排列,非常靠谱。

PS I:\> Get-Service | Sort-Object -Property Name | Format-Table Name, Status -AutoSize

Name                      Status
----                      ------
AdobeARMservice          Running
AeLookupSvc              Stopped
ALG                      Stopped
AlipaySecSvc             Running
AllUserInstallAgent      Stopped
AppHostSvc               Running

接下来,再使用Sort-Object的参数–Descending按服务名称降序排列

Get-Service | Sort-Object -Property Name -Descending | Format-Table Name, Status -AutoSize
PS I:\>  Get-Service | Sort-Object -Property Name -Descending | Format-Table Name, Status -AutoSize

Name                      Status
----                      ------
WwanSvc                  Stopped
wudfsvc                  Running
wuauserv                 Stopped
WSService                Stopped
WSearch                  Running
wscsvc                   Running

很简单,似乎也没问题。

那假如我现在想这样做:我按照服务的状态升序排列,把正在运行的服务放在前面,把已停止的服务放在后面。在字母中,‘R’排在‘S’前面,感觉应当没问题。

Get-Service | 
Sort-Object -Property Status | 
Format-Table Name, Status -AutoSize
PS I:\> Get-Service | Sort-Object -Property Status | Format-Table Name, Status -AutoSize

Name                      Status
----                      ------
vmicshutdown             Stopped
vmicrdv                  Stopped
NetTcpPortSharing        Stopped
NcaSvc                   Stopped
vmictimesync             Stopped
Netlogon                 Stopped
vmickvpexchange          Stopped
PeerDistSvc              Stopped

可是结果却出人意料,奇怪了,我明明期望运行的服务在前面,停止的服务在后面,因为我指定了按照服务的状态来升序排列啊。

属性“Status”是一个枚举值,而枚举值的定义中为整数。具体:服务停止的值为“1”,服务运行的值为“4”,这就不难理解了。

接下来让我们按照两个不同的属性,不同的排序顺序来排序:

get-service | 
sort-object -property @{Expression="Status";Descending=$true}, @{Expression="Name";Descending=$false} |
format-table name, status –autosize
PS I:\> get-service | sort-object -property @{Expression="Status";Descending=$true}, @{Expression="Name";Descending=$false} |format-table name, status –autosize
Name                      Status
----                      ------
AdobeARMservice          Running
AlipaySecSvc             Running
AppHostSvc               Running
Appinfo                  Running
AppMgmt                  Running
AudioEndpointBuilder     Running
Audiosrv                 Running
avast! Antivirus         Running

最后再强调下,按照服务的状态Status降序排序时,运行的服务才会排在最前面。

原文作者:Stefan Stranger

原文链接:PowerShell Sort-Object gotcha’s

本文链接: https://www.pstips.net/powershell-sort-object-gotchas.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

一条评论 “搞懂了PowerShell中的Sort-Object