Sort-Object

Ordena los objetos por valores de propiedad.

Syntax

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

Description

El Sort-Object cmdlet ordena los objetos en orden ascendente o descendente en función de los valores de propiedad del objeto. Si las propiedades de ordenación no se incluyen en un comando, PowerShell usa propiedades de ordenación predeterminadas del primer objeto de entrada. Si el tipo del objeto de entrada no tiene propiedades de ordenación predeterminadas, PowerShell intenta comparar los propios objetos. Para más información, vea la sección Notas.

Puede ordenar objetos por una sola propiedad o varias propiedades. Varias propiedades usan tablas hash para ordenar en orden ascendente, orden descendente o una combinación de órdenes de ordenación. Las propiedades se ordenan como distinguen mayúsculas de minúsculas o no distinguen mayúsculas de minúsculas. Use el parámetro Unique para quitar duplicados de la salida.

Ejemplos

Ejemplo 1: Ordenar el directorio actual por nombre

En este ejemplo se ordenan los archivos y subdirectorios de un directorio.

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

El Get-ChildItem cmdlet obtiene los archivos y subdirectorios del directorio especificado por el parámetro Path , C:\Test. Los objetos se envían a la canalización al Sort-Object cmdlet . Sort-Object no especifica una propiedad para que la salida se ordene por la propiedad de ordenación predeterminada, Name.

Ejemplo 2: Ordenar el directorio actual por longitud de archivo

Este comando muestra los archivos del directorio actual por longitud en orden ascendente.

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

El Get-ChildItem cmdlet obtiene los archivos del directorio especificado por el parámetro Path . El parámetro File especifica que Get-ChildItem solo obtiene objetos de archivo. Los objetos se envían a la canalización al Sort-Object cmdlet . Sort-Object usa el parámetro Length para ordenar los archivos por longitud en orden ascendente.

Ejemplo 3: Ordenar procesos por uso de memoria

En este ejemplo se muestran los procesos con el mayor uso de memoria en función del tamaño del conjunto de trabajo (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

El Get-Process cmdlet obtiene la lista de procesos que se ejecutan en el equipo. Los objetos de proceso se envían por la canalización al Sort-Object cmdlet . Sort-Object usa el parámetro Property para ordenar los objetos por WS. Los objetos se envían a la canalización al Select-Object cmdlet . Select-Objectusa el parámetro Last para especificar los últimos cinco objetos, que son los objetos con el uso de WS más alto.

Ejemplo 4: Ordenar objetos HistoryInfo por identificador

Este comando ordena los objetos HistoryInfo de la sesión de PowerShell mediante la propiedad Id. Cada sesión de PowerShell tiene su propio historial de comandos.

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\

El Get-History cmdlet obtiene los objetos de historial de la sesión actual de PowerShell. Los objetos se envían a la canalización al Sort-Object cmdlet . Sort-Object usa el parámetro Property para ordenar los objetos por Id. El parámetro Descendente ordena el historial de comandos del más reciente al más antiguo.

Ejemplo 5: Usar una tabla hash para ordenar las propiedades en orden ascendente y descendente

En este ejemplo se usan dos propiedades para ordenar los objetos, Status y DisplayName. El estado se ordena en orden descendente y DisplayName se ordena en orden ascendente.

Se usa una tabla hash para especificar el valor del parámetro Property . La tabla hash usa una expresión para especificar los nombres de propiedad y los pedidos de ordenación. Para obtener más información sobre las tablas hash, consulte about_Hash_Tables.

La propiedad Status usada en la tabla hash es una propiedad enumerada. Para obtener más información, consulte 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

El Get-Service cmdlet obtiene la lista de servicios en el equipo. Los objetos de servicio se envían a la canalización al Sort-Object cmdlet . Sort-Object usa el parámetro Property con una tabla hash para especificar los nombres de propiedad y los pedidos de ordenación. El parámetro Property se ordena por dos propiedades, Status en orden descendente y DisplayName en orden ascendente.

Status es una propiedad enumerada. Stopped tiene un valor de 1 y Running tiene un valor de 4. El parámetro Descendente se establece en $True para que los procesos en ejecución se muestren antes de los procesos detenidos . DisplayName establece el parámetro Descendente para $False ordenar los nombres para mostrar en orden alfabético.

Ejemplo 6: Ordenar archivos de texto por intervalo de tiempo

Este comando ordena los archivos de texto en orden descendente por el intervalo de tiempo entre CreationTime y 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

El Get-ChildItem cmdlet usa el parámetro Path para especificar el directorio C:\Test y todos los *.txt archivos. Los objetos se envían a la canalización al Sort-Object cmdlet . Sort-Object usa el parámetro Property con un scriptblock para determinar cada intervalo de tiempo de los archivos entre CreationTime y LastWriteTime.

Ejemplo 7: Ordenar nombres en un archivo de texto

En este ejemplo se muestra cómo ordenar una lista de un archivo de texto. El archivo original se muestra como una lista no ordenada. Sort-Object ordena el contenido y, a continuación, ordena el contenido con el parámetro Unique que quita duplicados.

# 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

El Get-Content cmdlet usa el parámetro Path para especificar el directorio y el nombre de archivo. El archivo ServerNames.txt contiene una lista no ordenada de nombres de equipo.

El Get-Content cmdlet usa el parámetro Path para especificar el directorio y el nombre de archivo. El archivo ServerNames.txt contiene una lista no ordenada de nombres de equipo. Los objetos se envían a la canalización al Sort-Object cmdlet . Sort-Object ordena la lista en el orden predeterminado, ascendente.

El Get-Content cmdlet usa el parámetro Path para especificar el directorio y el nombre de archivo. El archivo ServerNames.txt contiene una lista no ordenada de nombres de equipo. Los objetos se envían a la canalización al Sort-Object cmdlet . Sort-Object usa el parámetro Unique para quitar nombres de equipo duplicados. La lista se ordena en el orden predeterminado, ascendente.

Ejemplo 8: Ordenar una cadena como un entero

En este ejemplo se muestra cómo ordenar un archivo de texto que contiene objetos de cadena como enteros. Puede enviar cada comando a la canalización y Get-Member comprobar que los objetos son cadenas en lugar de enteros. Para estos ejemplos, el ProductId.txt archivo contiene una lista no ordenada de números de producto.

En el primer ejemplo, Get-Content obtiene el contenido del archivo y canaliza las líneas al Sort-Object cmdlet . Sort-Object ordena los objetos de cadena en orden ascendente.

# 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

En el segundo ejemplo, Get-Content obtiene el contenido del archivo y canaliza las líneas al Sort-Object cmdlet . Sort-Object usa un bloque de script para convertir las cadenas en enteros. En el código de ejemplo, [int] convierte la cadena en un entero y $_ representa cada cadena a medida que llega a la canalización. Los objetos enteros se envían a la canalización al Sort-Object cmdlet . Sort-Object ordena los objetos enteros en orden numérico.

Ejemplo 9: Ordenar por varias propiedades

Si desea ordenar por varias propiedades, separe las propiedades por comas.

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

El Get-ChildItem cmdlet obtiene los archivos del directorio especificado por el parámetro Path . Los objetos se envían a la canalización al Sort-Object cmdlet . Sort-Object usa el parámetro Length y Name para ordenar los archivos por longitud en orden ascendente. Puesto File01.txt que y File03.txt tienen la misma longitud, se ordenan por su propiedad Name.

Ejemplo 10: Ordenar tablas hash por sus valores de clave con propiedades calculadas

En este ejemplo se muestra cómo se pueden ordenar objetos hashtable por el valor de sus claves. Puede especificar uno o varios bloques de script para el parámetro Property . Las expresiones de estos bloques de script se usan para determinar el criterio de ordenación de la entrada, como los valores de las propiedades con nombre.

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

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

Las { $_.weight } expresiones y { $_.name } ordenan primero las tablas hash de entrada por el valor de su weight clave y, a continuación, por el valor de su name clave. El Sort-Object comando usa el parámetro OutVariable para almacenar el resultado en una variable y mostrar el resultado en la misma llamada.

El último comando recorre en iteración las tablas hash ordenadas para mostrar su nombre y peso como una cadena.

Parámetros

-CaseSensitive

Indica que la ordenación distingue mayúsculas de minúsculas. De forma predeterminada, las ordenación no distinguen mayúsculas de minúsculas.

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

-Culture

Especifica la configuración cultural que se va a usar para las ordenación. Use Get-Culture para mostrar la configuración de referencia cultural del sistema.

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

-Descending

Indica que Sort-Object ordena los objetos en orden descendente. El valor predeterminado es ascendente.

Para ordenar varias propiedades con distintos pedidos de ordenación, use una tabla hash. Por ejemplo, con una tabla hash puede ordenar una propiedad en orden ascendente y otra propiedad en orden descendente.

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

-InputObject

Para ordenar objetos, envíelos a la canalización a Sort-Object. Si usa el parámetro InputObject para enviar una colección de elementos, Sort-Object recibe un objeto que representa la colección. Dado que no se puede ordenar un objeto, Sort-Object devuelve toda la colección sin cambios.

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

-Property

Especifica los nombres de propiedad que Sort-Object se usan para ordenar los objetos. Se permiten los caracteres comodín. Los objetos se ordenan en función de los valores de propiedad. Si no especifica una propiedad, Sort-Object ordena en función de las propiedades predeterminadas para el tipo de objeto o los propios objetos.

Use comas para separar varias propiedades. Se pueden ordenar varias propiedades en orden ascendente, orden descendente o una combinación de órdenes de ordenación. Al especificar varias propiedades, los objetos se ordenan por la primera propiedad. Si varios objetos tienen el mismo valor para la primera propiedad, esos objetos se ordenan por la segunda propiedad. Este proceso continúa hasta que no haya más propiedades especificadas o no haya grupos de objetos.

El valor del parámetro Property puede ser una propiedad calculada. Para crear una propiedad calculada, use un scriptblock o una tabla hash.

Las claves válidas para una tabla hash son las siguientes:

  • expression - <string> o <script block>
  • ascending o descending - <boolean>

Para obtener más información, consulte about_Calculated_Properties.

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

-Unique

Indica que Sort-Object elimina los duplicados y devuelve solo los miembros únicos de la colección. La primera instancia de un valor único se incluye en la salida ordenada.

Unique no distingue mayúsculas de minúsculas. Las cadenas que solo difieren por mayúsculas y minúsculas se consideran iguales. Por ejemplo, carácter y CARÁCTER.

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

Entradas

PSObject

Puede canalizar los objetos que se van a ordenar a este cmdlet.

Salidas

PSObject

Este cmdlet devuelve los objetos ordenados.

Notas

Windows PowerShell incluye los siguientes alias para Sort-Object:

  • sort

El Sort-Object cmdlet ordena los objetos en función de las propiedades especificadas en el comando o las propiedades de ordenación predeterminadas para el tipo de objeto. Las propiedades de ordenación predeterminadas se definen mediante el PropertySet denominado DefaultKeyPropertySet en un types.ps1xml archivo. Para obtener más información, consulte about_Types.ps1xml.

Si un objeto no tiene una de las propiedades especificadas, el valor de propiedad de ese objeto se interpreta como Sort-ObjectNull y se coloca al final del criterio de ordenación.

Cuando no hay ninguna propiedad de ordenación disponible, PowerShell intenta comparar los propios objetos. Sort-Object usa el método Compare para cada propiedad. Si una propiedad no implementa IComparable, el cmdlet convierte el valor de propiedad en una cadena y usa el método Compare para System.String. Para obtener más información, vea Método PSObject.CompareTo(Object).

Si ordena en una propiedad enumerada como Status, Sort-Object ordena por los valores de enumeración. Para los servicios de Windows, Stopped tiene un valor de 1 y Running tiene un valor de 4. Stopped se ordena antes de En ejecución debido a los valores enumerados. Para obtener más información, consulte ServiceControllerStatus.