Windows Powershell排序和分组管道结果
使用Sort-Object和Group-Object可以对管道结果进行分组。
其实每条命令执行后的结果已经排过序了。例如通过ls查看文件列表,默认会根据Name属性进行排序,但是你可以通过指定属性进行排序例如:
PSC:Powershell>ls|Sort-ObjectLength ModeLastWriteTimeLengthName --------------------------- -a---2011/11/2815:3063ping.bat -a---2011/12/218:47140test.ps1 -a---2011/11/2816:42170test.vbs -a---2011/11/2811:12186LogoTestConfig.xml -a---2011/11/2317:37242test.txt -a---2011/11/2511:20556employee.xml
这样默认会根据length进行升序排序,如果要降序排列,可是使用Descending选项。
PSC:Powershell>ls|Sort-ObjectLength-Descending ModeLastWriteTimeLengthName --------------------------- -a---2011/11/2417:44735892Powershell_Cmdlets.html -a---2011/11/2418:3067580a.html -a---2011/11/2420:0426384a.txt -a---2011/11/2919:2321466function.ps1 -a---2011/11/2420:2612060alias -a---2011/11/2417:377420name.html
给对象和哈希表进行排序
如果要完成主要关键字降序,次要关键字升序的排序,可能首先想到的是:
PSC:Powershell>Dir|Sort-ObjectLength,Name-descending,-ascending Sort-Object:找不到接受实际参数“System.Object[]”的位置形式参数。 所在位置行:1字符:18 +Dir|Sort-Object<<<<Length,Name-descending,-ascending +CategoryInfo:InvalidArgument:(:)[Sort-Object],ParameterBin dingException +FullyQualifiedErrorId:PositionalParameterNotFound,Microsoft.PowerShell .Commands.SortObjectCommand
但是上面的方法行不通,可是这样操作:
PSC:Powershell>Dir|Sort-Object@{expression="Length";Descending=$true},@{ex pression="Name";Ascending=$true} 目录:C:Powershell ModeLastWriteTimeLengthName --------------------------- -a---2011/11/2417:44735892Powershell_Cmdlets.html -a---2011/11/2418:3067580a.html -a---2011/11/2420:0426384a.txt -a---2011/11/2919:2321466function.ps1 -a---2011/11/2420:2612060alias -a---2011/11/2417:377420name.html -a---2011/12/1411:223460ls.html -a---2011/11/3016:042556psdrive.html -a---2011/11/2511:20556employee.xml -a---2011/11/2317:37242test.txt -a---2011/11/2811:12186LogoTestConfig.xml -a---2011/11/2816:42170test.vbs -a---2011/12/218:47140test.ps1
对数据进行分组
如果想查看当前关闭和开启的所有服务,并且通过状态进行分组。可是使用:
PSC:Powershell>Get-Service|Group-ObjectStatus CountNameGroup -------------- 87Running{System.ServiceProcess.ServiceController,System.ServiceProcess.S erviceController,System.ServiceProcess.ServiceController,System .ServiceProcess.ServiceController...} 88Stopped{System.ServiceProcess.ServiceController,System.ServiceProcess.S erviceController,System.ServiceProcess.ServiceController,System .ServiceProcess.ServiceController...}
再举一例,把当前目录的文件以扩展名进行分组。
PSC:Powershell>ls|Group-ObjectExtension CountNameGroup -------------- 2{ABC,alias} 5.html{a.html,ls.html,name.html,Powershell_Cmdlets.html...} 2.txt{a.txt,test.txt} 2.xml{employee.xml,LogoTestConfig.xml} 2.ps1{function.ps1,test.ps1} 1.bat{ping.bat} 1.vbs{test.vbs}
使用表达式分组
如果要查看当前目录的文件,根据文件的大小是否大于1kb分组。
PSC:Powershell>ls|Group-Object{$_.Length-gt1kb} CountNameGroup -------------- 7False{ABC,employee.xml,LogoTestConfig.xml,ping... 8True{a.html,a.txt,alias,function.ps1...}
如果按照文件名的首字母分组
PSC:Powershell>ls|Group-Object{$_.name.SubString(0,1).toUpper()} CountNameGroup -------------- 3A{a.html,a.txt,alias} 1E{employee.xml} 1F{function.ps1} 2L{LogoTestConfig.xml,ls.html} 1N{name.html} 3P{ping.bat,Powershell_Cmdlets.html,psdrive.html} 3T{test.ps1,test.txt,test.vbs}
根据当前应用程序的发布者分组
PSC:Powershell>Get-Process|Group-ObjectCompany-NoElement CountName --------- 2AdobeSystemsIncorpor... 52 2微软 22MicrosoftCorporation 1AdobeSystems,Inc. 1Microsoft(R)Corporation 1 1NVIDIACorporation
使用格式化命令分组
Group-Object并不是唯一可以完成分组功能的命令,事实上格式化命令例如Format-Object支持一个GroupBy的参数,也可以完成分组。
PSC:Powershell>Dir|Sort-ObjectExtension,Name|Format-Table-groupByExtension 目录:C:Powershell ModeLastWriteTimeLengthName --------------------------- -a---2011/11/2420:2612060alias 目录:C:Powershell ModeLastWriteTimeLengthName --------------------------- -a---2011/11/2815:3063ping.bat 目录:C:Powershell ModeLastWriteTimeLengthName --------------------------- -a---2011/11/2418:3067580a.html -a---2011/12/1411:223460ls.html -a---2011/11/2417:377420name.html -a---2011/11/2417:44735892Powershell_Cmdlets.html -a---2011/11/3016:042556psdrive.html