Compartilhar via


Classificando objetos

Podemos organizar os dados exibidos para facilitar a verificação usando o Sort-Object cmdlet. Sort-Object usa o nome de uma ou mais propriedades para classificar e retorna dados classificados pelos valores dessas propriedades.

Classificação básica

Considere o problema de listar subdiretórios e arquivos no diretório atual. Se quisermos classificar por LastWriteTime e, em seguida, por Nome, podemos fazer isso digitando:

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
...

Você também pode classificar os objetos em ordem inversa especificando o parâmetro Decrescente[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

Usando tabelas de hash

Você pode classificar propriedades diferentes em ordens diferentes usando tabelas de hash dentro de uma matriz. Cada tabela de hash usa uma chave de expressão para especificar o nome da propriedade como cadeia de caracteres e uma chave crescente ou decrescente para especificar a ordem de classificação por $true ou $false. A chave expressão é obrigatória. A chave crescente ou decrescente é opcional.

O exemplo a seguir classifica objetos na ordem LastWriteTime decrescente e na ordem de nome crescente.

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
...

Você também pode definir um scriptblock para a Chave Expression. Ao executar o Sort-Object cmdlet, o scriptblock é executado e o resultado é usado para classificação.

O exemplo a seguir classifica objetos em ordem decrescente pelo período de tempo entre CreationTime e 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
...

Dicas

Você pode omitir o nome do parâmetro Property da seguinte maneira:

Sort-Object LastWriteTime, Name

Além disso, você pode se referir a Sort-Object pelo seu alias embutido, sort.

sort LastWriteTime, Name

As chaves nas tabelas de hash para classificação podem ser abreviadas da seguinte maneira:

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

Neste exemplo, o e significa Expressão, o d significa Decrescentee o a significa Crescente.

Para melhorar a legibilidade, você pode colocar as tabelas de hash em uma variável separada:

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

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