Sort-Object

Ordina gli oggetti in base ai valori delle proprietà.

Sintassi

Sort-Object
    [-Stable]
    [-Descending]
    [-Unique]
    [-InputObject <PSObject>]
    [[-Property] <Object[]>]
    [-Culture <String>]
    [-CaseSensitive]
    [<CommonParameters>]
Sort-Object
    [-Descending]
    [-Unique]
    -Top <Int32>
    [-InputObject <PSObject>]
    [[-Property] <Object[]>]
    [-Culture <String>]
    [-CaseSensitive]
    [<CommonParameters>]
Sort-Object
    [-Descending]
    [-Unique]
    -Bottom <Int32>
    [-InputObject <PSObject>]
    [[-Property] <Object[]>]
    [-Culture <String>]
    [-CaseSensitive]
    [<CommonParameters>]

Descrizione

Il Sort-Object cmdlet ordina gli oggetti in ordine crescente o decrescente in base ai valori delle proprietà dell'oggetto. Se le proprietà di ordinamento non sono incluse in un comando, PowerShell usa le proprietà di ordinamento predefinite del primo oggetto di input. Se il tipo dell'oggetto di input non ha proprietà di ordinamento predefinite, PowerShell tenta di confrontare gli oggetti stessi. Per altre informazioni, vedere la sezione Note .

È possibile ordinare gli oggetti in base a una singola proprietà o a più proprietà. Più proprietà usano tabelle hash per ordinare in ordine crescente, decrescente o una combinazione di ordini di ordinamento. Le proprietà vengono ordinate come distinzione tra maiuscole e minuscole o senza distinzione tra maiuscole e minuscole. Usare il parametro Unique per rimuovere i duplicati dall'output.

Esempio

Esempio 1: Ordinare la directory corrente in base al nome

In questo esempio vengono ordinati i file e le sottodirectory in una directory.

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

Il Get-ChildItem cmdlet ottiene i file e le sottodirectory dalla directory specificata dal parametro Path , C:\Test. Gli oggetti vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Objectnon specifica una proprietà in modo che l'output venga ordinato in base alla proprietà di ordinamento predefinita Name.

Esempio 2: Ordinare la directory corrente in base alla lunghezza del file

Questo comando visualizza i file nella directory corrente per lunghezza crescente.

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

Il Get-ChildItem cmdlet ottiene i file dalla directory specificata dal parametro Path . Il parametro File specifica che Get-ChildItem ottiene solo oggetti file. Gli oggetti vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object usa il parametro Length per ordinare i file in base alla lunghezza in ordine crescente.

Esempio 3: Ordinare i processi in base all'utilizzo della memoria

In questo esempio vengono visualizzati i processi con l'utilizzo di memoria più elevato in base alle dimensioni del working set (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

Il Get-Process cmdlet ottiene l'elenco dei processi in esecuzione nel computer. Gli oggetti processo vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object utilizza il parametro Property per ordinare gli oggetti in base a WS. Gli oggetti vengono inviati alla pipeline al Select-Object cmdlet . Select-Object usa il parametro Last per specificare gli ultimi cinque oggetti, ovvero gli oggetti con il massimo utilizzo di WS .

In PowerShell 6 il Sort-Object parametro Bottom è un'alternativa a Select-Object. Ad esempio: Get-Process | Sort-Object -Property WS -Bottom 5.

Esempio 4: Ordinare oggetti HistoryInfo in base all'ID

Questo comando ordina gli oggetti HistoryInfo della sessione di PowerShell usando la proprietà Id. Ogni sessione di PowerShell ha una propria cronologia dei comandi.

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\

Il Get-History cmdlet ottiene gli oggetti cronologia dalla sessione di PowerShell corrente. Gli oggetti vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object utilizza il parametro Property per ordinare gli oggetti in base all'ID. Il parametro Decrescente ordina la cronologia dei comandi dal più recente al meno recente.

Esempio 5: Usare una tabella hash per ordinare le proprietà in ordine crescente e decrescente

In questo esempio vengono utilizzate due proprietà per ordinare gli oggetti, Status e DisplayName. Lo stato viene ordinato in ordine decrescente e DisplayName viene ordinato in ordine crescente.

Viene utilizzata una tabella hash per specificare il valore del parametro Property . La tabella hash usa un'espressione per specificare i nomi delle proprietà e gli ordini di ordinamento. Per altre informazioni sulle tabelle hash, vedere about_Hash_Tables.

La proprietà Status utilizzata nella tabella hash è una proprietà enumerata. Per altre informazioni, vedere 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

Il Get-Service cmdlet ottiene l'elenco dei servizi nel computer. Gli oggetti servizio vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object utilizza il parametro Property con una tabella hash per specificare i nomi delle proprietà e ordinare gli ordini. Il parametro Property viene ordinato in base a due proprietà, Status in ordine decrescente e DisplayName in ordine crescente.

Status è una proprietà enumerata. Stopped ha un valore pari a 1 e Running ha un valore pari a 4. Il parametro Descending è impostato su $True in modo che i processi in esecuzione vengano visualizzati prima dei processi arrestati. DisplayName imposta il parametro Descending su $False per ordinare i nomi visualizzati in ordine alfabetico.

Esempio 6: Ordinare i file di testo per intervallo di tempo

Questo comando ordina i file di testo in ordine decrescente in base all'intervallo di tempo tra CreationTime e 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

Il Get-ChildItem cmdlet usa il parametro Path per specificare la directory C:\Test e tutti i *.txt file. Gli oggetti vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object usa il parametro Property con un blocco di script per determinare ogni intervallo di tempo dei file tra CreationTime e LastWriteTime.

Esempio 7: Ordinare i nomi in un file di testo

In questo esempio viene illustrato come ordinare un elenco da un file di testo. Il file originale viene visualizzato come elenco non ordinato. Sort-Object ordina il contenuto e quindi ordina il contenuto con il parametro Unique che rimuove i duplicati.

# 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

Il Get-Content cmdlet usa il parametro Path per specificare la directory e il nome file. Il file ServerNames.txt contiene un elenco non ordinato di nomi di computer.

Il Get-Content cmdlet usa il parametro Path per specificare la directory e il nome file. Il file ServerNames.txt contiene un elenco non ordinato di nomi di computer. Gli oggetti vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object ordina l'elenco nell'ordine predefinito, crescente.

Il Get-Content cmdlet usa il parametro Path per specificare la directory e il nome file. Il file ServerNames.txt contiene un elenco non ordinato di nomi di computer. Gli oggetti vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object usa il parametro Unique per rimuovere i nomi di computer duplicati. L'elenco viene ordinato nell'ordine predefinito, crescente.

Esempio 8: Ordinare una stringa come numero intero

In questo esempio viene illustrato come ordinare un file di testo contenente oggetti stringa come numeri interi. È possibile inviare ogni comando alla pipeline e Get-Member verificare che gli oggetti siano stringhe anziché numeri interi. Per questi esempi, il ProductId.txt file contiene un elenco non ordinato di numeri di prodotto.

Nel primo esempio ottiene Get-Content il contenuto delle righe del file e delle pipe al Sort-Object cmdlet . Sort-Object ordina gli oggetti stringa in ordine crescente.

# 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

Nel secondo esempio, Get-Content ottiene il contenuto delle righe di file e pipe al Sort-Object cmdlet . Sort-Object usa un blocco di script per convertire le stringhe in numeri interi. Nel codice [int] di esempio converte la stringa in un numero intero e $_ rappresenta ogni stringa man mano che si trova nella pipeline. Gli oggetti integer vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object ordina gli oggetti integer in ordine numerico.

Esempio 9: Uso di ordinamenti stabili

Quando si usano i parametri Top, Bottom o Stable , gli oggetti ordinati vengono recapitati nell'ordine in cui sono stati ricevuti quando Sort-Object i criteri di ordinamento sono uguali. In questo esempio i numeri da uno a 20 vengono ordinati in base al valore "modulo 3". Il valore modulo è compreso tra zero e due.

1..20 |Sort-Object {$_ % 3}

18
3
15
6
12
9
1
16
13
10
7
4
19
11
8
14
5
17
2
20

1..20 |Sort-Object {$_ % 3} -Stable

3
6
9
12
15
18
1
4
7
10
13
16
19
2
5
8
11
14
17
20

L'output del primo ordinamento viene raggruppato correttamente in base al valore del modulo, ma i singoli elementi non vengono ordinati all'interno dell'intervallo modulo. Il secondo ordinamento usa l'opzione Stable per restituire un ordinamento stabile.

Esempio 10: Ordinare in base a più proprietà

Se si desidera ordinare in base a più proprietà, separare le proprietà in base a virgole.

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

Il Get-ChildItem cmdlet ottiene i file dalla directory specificata dal parametro Path . Gli oggetti vengono inviati alla pipeline al Sort-Object cmdlet . Sort-Object usa il parametro Length e Name per ordinare i file in base alla lunghezza in ordine crescente. Poiché File01.txt e File03.txt hanno la stessa lunghezza, vengono ordinati ulteriormente in base alla proprietà Name.

Esempio 11: Ordinare tabelle hash in base al valore della chiave

A partire da PowerShell 6, Sort-Object supporta l'ordinamento dell'input della tabella hash in base ai valori chiave. Nell'esempio seguente viene ordinata una matrice di tabelle hash in base al valore della chiave di weight ogni tabella hash.

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

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

Name                           Value
----                           -----
Weight                         1
Name                           b
Weight                         3
Name                           c
Weight                         7
Name                           a
Weight                         7
Name                           d

b: 1
c: 3
a: 7
d: 7

Parametri

-Bottom

Specifica il numero di oggetti da ottenere dalla fine di una matrice di oggetti ordinati. Ciò comporta un ordinamento stabile.

Questo parametro è stato introdotto in PowerShell 6.0.

Tipo:Int32
Posizione:Named
Valore predefinito:None
Necessario:True
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-CaseSensitive

Indica che l'ordinamento fa distinzione tra maiuscole e minuscole. Per impostazione predefinita, gli ordinamenti non fanno distinzione tra maiuscole e minuscole.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:Case-insensitive
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Culture

Specifica la configurazione culturale da utilizzare per gli ordinamenti. Usare Get-Culture per visualizzare la configurazione delle impostazioni cultura del sistema.

Tipo:String
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Descending

Indica che Sort-Object ordina gli oggetti in ordine decrescente. Per impostazione predefinita, l'ordinamento è crescente.

Per ordinare più proprietà con ordinamenti diversi, usare una tabella hash. Ad esempio, con una tabella hash è possibile ordinare una proprietà in ordine crescente e un'altra proprietà in ordine decrescente.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:Ascending
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-InputObject

Per ordinare gli oggetti, inviarli verso il basso nella pipeline a Sort-Object. Se si utilizza il parametro InputObject per inviare una raccolta di elementi, Sort-Object riceve un oggetto che rappresenta la raccolta. Poiché non è possibile ordinare un oggetto, Sort-Object restituisce l'intera raccolta invariata.

Tipo:PSObject
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:True
Accettare caratteri jolly:False

-Property

Specifica i nomi delle proprietà utilizzati Sort-Object per ordinare gli oggetti. I caratteri jolly sono consentiti. Gli oggetti vengono ordinati in base ai valori delle proprietà. Se non si specifica una proprietà, Sort-Object ordina in base alle proprietà predefinite per il tipo di oggetto o gli oggetti stessi.

Usare le virgole per separare più proprietà. È possibile ordinare più proprietà in ordine crescente, decrescente o in una combinazione di ordini di ordinamento. Quando si specificano più proprietà, gli oggetti vengono ordinati in base alla prima proprietà. Se più oggetti hanno lo stesso valore per la prima proprietà, tali oggetti vengono ordinati in base alla seconda proprietà. Questo processo continua fino a quando non sono presenti più proprietà né gruppi di oggetti specificati.

Il valore del parametro Property può essere una proprietà calcolata. Per creare una proprietà calcolata, usare uno scriptblock o una tabella hash.

Le chiavi valide per una tabella hash sono le seguenti:

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

Per altre informazioni, vedere about_Calculated_Properties.

Tipo:Object[]
Posizione:0
Valore predefinito:Default properties
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:True

-Stable

Gli oggetti ordinati vengono recapitati nell'ordine in cui sono stati ricevuti quando i criteri di ordinamento sono uguali.

Questo parametro è stato aggiunto in PowerShell v6.2.0.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Top

Specifica il numero di oggetti da ottenere dall'inizio di una matrice di oggetti ordinati. Ciò comporta un ordinamento stabile.

Questo parametro è stato introdotto in PowerShell 6.0.

Tipo:Int32
Posizione:Named
Valore predefinito:None
Necessario:True
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-Unique

Indica che Sort-Object elimina i duplicati e restituisce solo i membri univoci della raccolta. La prima istanza di un valore univoco è inclusa nell'output ordinato.

L'univocità non fa distinzione tra maiuscole e minuscole. Le stringhe che differiscono solo in base alla distinzione tra maiuscole e minuscole vengono considerate uguali. Ad esempio, carattere e CARATTERE.

Tipo:SwitchParameter
Posizione:Named
Valore predefinito:All
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

Input

PSObject

È possibile inviare tramite pipe gli oggetti da ordinare a questo cmdlet.

Output

PSObject

Questo cmdlet restituisce gli oggetti ordinati.

Note

PowerShell include gli alias seguenti per Sort-Object:

  • Windows:
    • sort

Il Sort-Object cmdlet ordina gli oggetti in base alle proprietà specificate nel comando o alle proprietà di ordinamento predefinite per il tipo di oggetto. Le proprietà di ordinamento predefinite vengono definite usando l'oggetto PropertySet denominato DefaultKeyPropertySet in un types.ps1xml file. Per altre informazioni, vedere about_Types.ps1xml.

Se un oggetto non dispone di una delle proprietà specificate, il valore della proprietà per tale oggetto viene interpretato da Sort-Object Null e posizionato alla fine dell'ordinamento.

Quando non sono disponibili proprietà di ordinamento, PowerShell tenta di confrontare gli oggetti stessi. Sort-Object utilizza il metodo Compare per ogni proprietà. Se una proprietà non implementa IComparable, il cmdlet converte il valore della proprietà in una stringa e usa il metodo Compare per System.String. Per altre informazioni, vedere Metodo PSObject.CompareTo(Object).

Se si esegue l'ordinamento in base a una proprietà enumerata, ad esempio Status, Sort-Object vengono ordinati in base ai valori di enumerazione. Per i servizi Windows, Stopped ha un valore pari a 1 e Running ha un valore pari a 4. Stopped viene ordinato prima di In esecuzione a causa dei valori enumerati. Per altre informazioni, vedere ServiceControllerStatus.

Le prestazioni dell'algoritmo di ordinamento sono più lente quando si esegue un ordinamento stabile.