Compartir a través de


Ordenar objetos

Podemos organizar los datos mostrados para facilitar el examen mediante el Sort-Object cmdlet . Sort-Object toma el nombre de una o varias propiedades para ordenar y devuelve los datos ordenados por los valores de esas propiedades.

Ordenación básica

Considere el problema de enumerar subdirectorios y archivos en el directorio actual. Si queremos ordenar por LastWriteTime y, a continuación, por Nombre, podemos hacerlo escribiendo:

Get-ChildItem |
    Sort-Object -Property LastWriteTime, Name |
    Format-Table -Property LastWriteTime, Name
LastWriteTime          Name
-------------          ----
11/6/2017 10:10:11 AM  .localization-config
11/6/2017 10:10:11 AM  .openpublishing.build.ps1
11/6/2017 10:10:11 AM  appveyor.yml
11/6/2017 10:10:11 AM  LICENSE
11/6/2017 10:10:11 AM  LICENSE-CODE
11/6/2017 10:10:11 AM  ThirdPartyNotices
11/6/2017 10:10:15 AM  tests
6/6/2018 7:58:59 PM    CONTRIBUTING.md
6/6/2018 7:58:59 PM    README.md
...

También puede ordenar los objetos en orden inverso especificando el parámetro Descendente[switch] .

Get-ChildItem |
  Sort-Object -Property LastWriteTime, Name -Descending |
  Format-Table -Property LastWriteTime, Name
LastWriteTime          Name
-------------          ----
12/1/2018 10:13:50 PM  reference
12/1/2018 10:13:50 PM  dsc
...
6/6/2018 7:58:59 PM    README.md
6/6/2018 7:58:59 PM    CONTRIBUTING.md
11/6/2017 10:10:15 AM  tests
11/6/2017 10:10:11 AM  ThirdPartyNotices
11/6/2017 10:10:11 AM  LICENSE-CODE
11/6/2017 10:10:11 AM  LICENSE
11/6/2017 10:10:11 AM  appveyor.yml
11/6/2017 10:10:11 AM  .openpublishing.build.ps1
11/6/2017 10:10:11 AM  .localization-config

Uso de tablas hash

Puede ordenar diferentes propiedades en diferentes órdenes mediante tablas hash en una matriz. Cada tabla hash usa una clave de expresión para especificar el nombre de propiedad como cadena y una clave ascendente o descendente para especificar el criterio de ordenación por $true o $false. La clave de expresión es obligatoria. La clave ascendente o descendente es opcional.

En el ejemplo siguiente se ordenan los objetos en orden descendente LastWriteTime y orden de nombre ascendente.

Get-ChildItem |
  Sort-Object -Property @{ Expression = 'LastWriteTime'; Descending = $true },
                        @{ Expression = 'Name'; Ascending = $true } |
  Format-Table -Property LastWriteTime, Name
LastWriteTime          Name
-------------          ----
12/1/2018 10:13:50 PM  dsc
12/1/2018 10:13:50 PM  reference
11/29/2018 6:56:01 PM  .openpublishing.redirection.json
11/29/2018 6:56:01 PM  gallery
11/24/2018 10:33:22 AM developer
11/20/2018 7:22:19 PM  .markdownlint.json
...

También puede asignar un scriptblock a la clave Expression. Al ejecutar el Sort-Object cmdlet, se ejecuta el scriptblock y el resultado se usa para la ordenación.

En el ejemplo siguiente se ordenan los objetos en orden descendente por el intervalo de tiempo entre CreationTime y LastWriteTime.

Get-ChildItem |
    Sort-Object -Property @{ Exp = { $_.LastWriteTime - $_.CreationTime }; Desc = $true } |
    Format-Table -Property LastWriteTime, CreationTime
LastWriteTime          CreationTime
-------------          ------------
12/1/2018 10:13:50 PM  11/6/2017 10:10:11 AM
12/1/2018 10:13:50 PM  11/6/2017 10:10:11 AM
11/7/2018 6:52:24 PM   11/6/2017 10:10:11 AM
11/7/2018 6:52:24 PM   11/6/2017 10:10:15 AM
11/3/2018 9:58:17 AM   11/6/2017 10:10:11 AM
10/26/2018 4:50:21 PM  11/6/2017 10:10:11 AM
11/17/2018 1:10:57 PM  11/29/2017 5:48:30 PM
11/12/2018 6:29:53 PM  12/7/2017 7:57:07 PM
...

Sugerencias

Puede omitir el nombre del parámetro Property como se indica a continuación:

Sort-Object LastWriteTime, Name

Además, puede hacer referencia a Sort-Object mediante su alias integrado, sort:

sort LastWriteTime, Name

Las claves de las tablas hash para la ordenación se pueden abreviar como se indica a continuación:

Sort-Object @{ e = 'LastWriteTime'; d = $true }, @{ e = 'Name'; a = $true }

En este ejemplo, la e representa Expresión, la d representa Descendente y la a representa Ascendente.

Para mejorar la legibilidad, puede colocar las tablas hash en una variable independiente:

$order = @(
  @{ Expression = 'LastWriteTime'; Descending = $true }
  @{ Expression = 'Name'; Ascending = $true }
)

Get-ChildItem |
    Sort-Object $order |
    Format-Table LastWriteTime, Name