Select-Object

Seleziona oggetti o proprietà di oggetti.

Sintassi

Select-Object
      [[-Property] <Object[]>]
      [-InputObject <psobject>]
      [-ExcludeProperty <string[]>]
      [-ExpandProperty <string>]
      [-Unique]
      [-Last <int>]
      [-First <int>]
      [-Skip <int>]
      [-Wait]
      [<CommonParameters>]
Select-Object
      [[-Property] <Object[]>]
      [-InputObject <psobject>]
      [-ExcludeProperty <string[]>]
      [-ExpandProperty <string>]
      [-Unique]
      [-SkipLast <int>]
      [<CommonParameters>]
Select-Object
      [-InputObject <psobject>]
      [-Unique]
      [-Wait]
      [-Index <int[]>]
      [<CommonParameters>]

Descrizione

Il Select-Object cmdlet seleziona le proprietà specificate di un oggetto o di un set di oggetti. Può inoltre selezionare oggetti univoci, un numero specificato di oggetti o gli oggetti che si trovano in una posizione specificata all'interno di una matrice.

Per selezionare gli oggetti da una raccolta, utilizzare i parametri First, Last, Unique, Skip e Index . Per selezionare le proprietà dell'oggetto, usare il parametro Property . Quando si selezionano proprietà, Select-Object restituisce nuovi oggetti con solo le proprietà specificate.

A partire da Windows PowerShell 3.0, Select-Object include una funzionalità di ottimizzazione che impedisce ai comandi di creare ed elaborare oggetti non usati.

Quando si usano Select-Object con i parametri First o Index in una pipeline di comandi, PowerShell arresta il comando che genera gli oggetti non appena viene raggiunto il numero selezionato di oggetti. Per disattivare questo comportamento di ottimizzazione, usare il parametro Wait .

Esempio

Esempio 1: Selezionare gli oggetti per proprietà

In questo esempio vengono creati oggetti con proprietà Name, ID e Working Set (WS) degli oggetti processo.

Get-Process | Select-Object -Property ProcessName, Id, WS

Esempio 2: Selezionare gli oggetti per proprietà e formattare i risultati

In questo esempio vengono recuperate informazioni sui moduli utilizzati dai processi nel computer. Usa il Get-Process cmdlet per ottenere il processo nel computer.

Usa il Select-Object cmdlet per restituire una matrice di [System.Diagnostics.ProcessModule] istanze come contenuta nella proprietà Modules di ogni output di ogni System.Diagnostics.Process istanza da Get-Process.

Il parametro Property del Select-Object cmdlet seleziona i nomi dei processi. In questo modo viene aggiunta una ProcessName proprietà NoteProperty a ogni [System.Diagnostics.ProcessModule] istanza e viene popolata con il valore della proprietà ProcessName del processo corrente.

Infine, Format-List il cmdlet viene usato per visualizzare il nome e i moduli di ogni processo in un elenco.

Get-Process Explorer |
    Select-Object -Property ProcessName -ExpandProperty Modules |
    Format-List

ProcessName       : explorer
ModuleName        : explorer.exe
FileName          : C:\WINDOWS\explorer.exe
BaseAddress       : 140697278152704
ModuleMemorySize  : 3919872
EntryPointAddress : 140697278841168
FileVersionInfo   : File:             C:\WINDOWS\explorer.exe
                    InternalName:     explorer
                    OriginalFilename: EXPLORER.EXE.MUI
                    FileVersion:      10.0.17134.1 (WinBuild.160101.0800)
                    FileDescription:  Windows Explorer
                    Product:          Microsoft Windows Operating System
                    ProductVersion:   10.0.17134.1
...

Esempio 3: Selezionare i processi con la maggior quantità di memoria

Questo esempio ottiene i cinque processi che usano la maggior parte della memoria. Il Get-Process cmdlet ottiene i processi nel computer. Il Sort-Object cmdlet ordina i processi in base all'utilizzo della memoria (working set) e il Select-Object cmdlet seleziona solo gli ultimi cinque membri della matrice risultante di oggetti.

Il parametro Wait non è obbligatorio nei comandi che includono il Sort-Object cmdlet perché Sort-Object elabora tutti gli oggetti e quindi restituisce una raccolta. L'ottimizzazione Select-Object è disponibile solo per i comandi che restituiscono oggetti singolarmente durante l'elaborazione.

Get-Process | Sort-Object -Property WS | Select-Object -Last 5

Handles  NPM(K)    PM(K)      WS(K) VS(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
2866     320       33432      45764   203   222.41   1292 svchost
577      17        23676      50516   265    50.58   4388 WINWORD
826      11        75448      76712   188    19.77   3780 Ps
1367     14        73152      88736   216    61.69    676 Ps
1612     44        66080      92780   380   900.59   6132 INFOPATH

Esempio 4: Selezionare caratteri univoci da una matrice

In questo esempio viene usato il parametro Unique di Select-Object per ottenere caratteri univoci da una matrice di caratteri.

"a","b","c","a","a","a" | Select-Object -Unique

a
b
c

Esempio 5: Uso di '-Unique' con altri parametri

I valori dei parametri Unique filtrano i valori dopo l'applicazione di altri Select-Object parametri. Ad esempio, se si usa il parametro First per selezionare il primo numero di elementi in una matrice, Unique viene applicato solo ai valori selezionati e non all'intera matrice.

"a","a","b","c" | Select-Object -First 2 -Unique

a

In questo esempio, first selects "a","a" as the first 2 items in the array. Univoco viene applicato a "a","a" e restituisce a come valore univoco.

Esempio 6: Selezionare gli eventi più recenti e meno recenti nel registro eventi

Questo esempio ottiene i primi eventi (più recenti) e gli ultimi (meno recenti) nel registro eventi di Windows PowerShell.

Get-EventLog ottiene tutti gli eventi nel log di Windows PowerShell e li salva nella $a variabile. $a Viene quindi inviata tramite pipe al Select-Object cmdlet . Il Select-Object comando usa il parametro Index per selezionare gli eventi dalla matrice di eventi nella $a variabile . L'indice del primo evento è 0. L'indice dell'ultimo evento è il numero di elementi in $a meno 1.

$a = Get-EventLog -LogName "Windows PowerShell"
$a | Select-Object -Index 0, ($A.count - 1)

Esempio 7: Selezionare tutto ma il primo oggetto

In questo esempio viene creata una nuova sessione PSSession in ognuno dei computer elencati nei file Servers.txt, ad eccezione del primo.

Select-Object seleziona tutto ma il primo computer in un elenco di nomi di computer. L'elenco risultante dei computer viene impostato come valore del parametro ComputerName del New-PSSession cmdlet.

New-PSSession -ComputerName (Get-Content Servers.txt | Select-Object -Skip 1)

Esempio 8: Rinominare i file e selezionare diversi da rivedere

In questo esempio viene aggiunto un suffisso "-ro" ai nomi di base dei file di testo con l'attributo di sola lettura e quindi vengono visualizzati i primi cinque file in modo che l'utente possa visualizzare un esempio dell'effetto.

Get-ChildItem usa il parametro dinamico ReadOnly per ottenere file di sola lettura. I file risultanti vengono inviati tramite pipe al Rename-Item cmdlet , che rinomina il file. Usa il parametro PassThru di Rename-Item per inviare i file rinominati al cmdlet , che seleziona il primo 5 per la Select-Object visualizzazione.

Il parametro Wait di Select-Object impedisce a PowerShell di arrestare il Get-ChildItem cmdlet dopo aver ottenuto i primi cinque file di testo di sola lettura. Senza questo parametro verrebbero rinominati solo i primi cinque file di sola lettura.

Get-ChildItem *.txt -ReadOnly |
    Rename-Item -NewName {$_.BaseName + "-ro.txt"} -PassThru |
    Select-Object -First 5 -Wait

Esempio 9: Visualizzare le complessità del parametro -ExpandProperty

Questo esempio mostra le complessità del parametro ExpandProperty .

Si noti che l'output generato è una matrice di [System.Int32] istanze. Le istanze sono conformi alle regole di formattazione standard della visualizzazione output. Questo vale per tutte le proprietà Espanse . Se gli oggetti restituiti hanno un formato standard specifico, la proprietà espansa potrebbe non essere visibile.

# Create a custom object to use for the Select-Object example.
$object = [pscustomobject]@{Name="CustomObject";Expand=@(1,2,3,4,5)}
# Use the ExpandProperty parameter to Expand the property.
$object | Select-Object -ExpandProperty Expand -Property Name

1
2
3
4
5

# The output did not contain the Name property, but it was added successfully.
# Use Get-Member to confirm the Name property was added and populated.
$object | Select-Object -ExpandProperty Expand -Property Name | Get-Member

TypeName: System.Int32

Name        MemberType   Definition
----        ----------   ----------
CompareTo   Method       int CompareTo(System.Object value), int CompareTo(int value), ...
Equals      Method       bool Equals(System.Object obj), bool Equals(int obj), bool IEq...
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
GetTypeCode Method       System.TypeCode GetTypeCode(), System.TypeCode IConvertible.Ge...
ToBoolean   Method       bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte      Method       byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar      Method       char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime  Method       datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal   Method       decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble    Method       double IConvertible.ToDouble(System.IFormatProvider provider)
ToInt16     Method       int16 IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32     Method       int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64     Method       long IConvertible.ToInt64(System.IFormatProvider provider)
ToSByte     Method       sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToSingle    Method       float IConvertible.ToSingle(System.IFormatProvider provider)
ToString    Method       string ToString(), string ToString(string format), string ToS...
ToType      Method       System.Object IConvertible.ToType(type conversionType, System...
ToUInt16    Method       uint16 IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32    Method       uint32 IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64    Method       uint64 IConvertible.ToUInt64(System.IFormatProvider provider)
Name        NoteProperty string Name=CustomObject

Esempio 10: Creare proprietà personalizzate per gli oggetti

Nell'esempio seguente viene illustrato l'utilizzo Select-Object di per aggiungere una proprietà personalizzata a qualsiasi oggetto . Quando si specifica un nome di proprietà che non esiste, Select-Object crea tale proprietà come NotaProperty per ogni oggetto passato.

$customObject = 1 | Select-Object -Property MyCustomProperty
$customObject.MyCustomProperty = "New Custom Property"
$customObject

MyCustomProperty
----------------
New Custom Property

Esempio 11: Creare proprietà calcolate per ogni InputObject

In questo esempio viene illustrato l'uso Select-Object di per aggiungere proprietà calcolate all'input. Il passaggio di un oggetto ScriptBlock al parametro Property determina Select-Object la valutazione dell'espressione in ogni oggetto passato e l'aggiunta dei risultati all'output. All'interno di ScriptBlock è possibile usare la $_ variabile per fare riferimento all'oggetto corrente nella pipeline.

Per impostazione predefinita, Select-Object usa la stringa ScriptBlock come nome della proprietà. Usando una tabella Hash, è possibile etichettare l'output di ScriptBlock come proprietà personalizzata aggiunta a ogni oggetto. È possibile aggiungere più proprietà calcolate a ogni oggetto passato a Select-Object.

# Create a calculated property called $_.StartTime.DayOfWeek
Get-Process | Select-Object -Property ProcessName,{$_.StartTime.DayOfWeek}

ProcessName  $_.StartTime.DayOfWeek
----         ----------------------
alg                       Wednesday
ati2evxx                  Wednesday
ati2evxx                   Thursday
...

# Add a custom property to calculate the size in KiloBytes of each FileInfo
# object you pass in. Use the pipeline variable to divide each file's length by
# 1 KiloBytes
$size = @{label="Size(KB)";expression={$_.length/1KB}}
# Create an additional calculated property with the number of Days since the
# file was last accessed. You can also shorten the key names to be 'l', and 'e',
# or use Name instead of Label.
$days = @{l="Days";e={((Get-Date) - $_.LastAccessTime).Days}}
# You can also shorten the name of your label key to 'l' and your expression key
# to 'e'.
Get-ChildItem $PSHOME -File | Select-Object Name, $size, $days

Name                        Size(KB)        Days
----                        --------        ----
Certificate.format.ps1xml   12.5244140625   223
Diagnostics.Format.ps1xml   4.955078125     223
DotNetTypes.format.ps1xml   134.9833984375  223

Esempio 12: Selezione delle chiavi di una tabella hash con proprietà calcolate

In questo esempio viene illustrato come usare Select-Object per visualizzare le coppie chiave-valore di un oggetto hashtable con proprietà calcolate. Ogni tabella hash della proprietà calcolata specifica l'etichetta della nuova proprietà come nome visualizzato per la chiave e un'espressione che recupera il valore per tale chiave.

@{ name = 'a' ; weight = 7 } | Select-Object -Property @(
    @{ label = 'Name' ; expression = { $_.name } }
    @{ label = 'Weight' ; expression = { $_.weight } }
)

Name Weight
---- ------
a         7

Esempio 13 - ExpandProperty modifica l'oggetto originale

In questo esempio viene illustrato l'effetto collaterale dell'uso del parametro ExpandProperty . Quando si usa ExpandProperty, Select-Object aggiunge le proprietà selezionate all'oggetto originale come membri NoteProperty .

PS> $object = [PSCustomObject]@{
    name = 'USA'
    children = [PSCustomObject]@{
        name = 'Southwest'
    }
}
PS> $object

name children
---- --------
USA  @{name=Southwest}

# Use the ExpandProperty parameter to expand the children property
PS> $object | Select-Object @{n="country"; e={$_.name}} -ExpandProperty children

name      country
----      -------
Southwest USA

# The original object has been altered
PS> $object

name children
---- --------
USA  @{name=Southwest; country=USA}

Come si può notare, la proprietà country è stata aggiunta all'oggetto children dopo aver utilizzato il parametro ExpandProperty .

Esempio 14 - Creare un nuovo oggetto con proprietà espanse senza modificare l'oggetto di input

È possibile evitare l'effetto collaterale dell'utilizzo del parametro ExpandProperty creando un nuovo oggetto e copiando le proprietà dall'oggetto di input.

PS> $object = [PSCustomObject]@{
    name = 'USA'
    children = [PSCustomObject]@{
        name = 'Southwest'
    }
}
PS> $object

name children
---- --------
USA  @{name=Southwest}

# Create a new object with selected properties
PS> $newobject = [PSCustomObject]@{
    country = $object.name
    children = $object.children
}

PS> $newobject

country children
------- --------
USA     @{name=Southwest}

# $object remains unchanged
PS> $object

name children
---- --------
USA  @{name=Southwest}

Parametri

-ExcludeProperty

Specifica le proprietà che questo cmdlet esclude dall'operazione. I caratteri jolly sono consentiti. Questo parametro è valido solo quando il comando include anche il parametro Property .

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

-ExpandProperty

Specifica una proprietà da selezionare e indica che deve essere effettuato un tentativo di espandere tale proprietà. Se la pipeline dell'oggetto di input non ha la proprietà denominata, Select-Object restituisce un errore.

  • Se la proprietà specificata è una matrice, ogni valore della matrice viene incluso nell'output.
  • Se la proprietà specificata è un oggetto , le proprietà degli oggetti vengono espanse per ogni InputObject

In entrambi i casi, il tipo degli oggetti di output corrisponde al tipo della proprietà espansa.

Nota

Quando si usa ExpandProperty, è presente un effetto collaterale. Aggiunge Select-Object le proprietà selezionate all'oggetto originale come membri NoteProperty .

Se viene specificato il parametro Property , Select-Object tenta di aggiungere ogni proprietà selezionata come NotaProperty a ogni oggetto restituito.

Avviso

Se viene visualizzato un errore che indica che non è possibile elaborare una proprietà perché esiste già una proprietà con tale nome, tenere presente quanto segue. Si noti che quando si usa ExpandProperty, Select-Object non può sostituire una proprietà esistente. Ciò significa:

  • Se l'oggetto espanso ha una proprietà con lo stesso nome, il comando restituisce un errore.
  • Se l'oggetto Selected ha una proprietà con lo stesso nome della proprietà di un oggetto Expanded , il comando restituisce un errore.
Tipo:String
Posizione:Named
Valore predefinito:None
Necessario:False
Accettare l'input della pipeline:False
Accettare caratteri jolly:False

-First

Specifica il numero di oggetti da selezionare dall'inizio di una matrice di oggetti di input.

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

-Index

Seleziona gli oggetti di una matrice in base ai valori di indice. Immettere gli indici in un elenco delimitato da virgole. Gli indici in una matrice iniziano per 0, dove 0 rappresenta il primo valore e (n-1) rappresenta l'ultimo valore.

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

-InputObject

Specifica gli oggetti da inviare al cmdlet tramite la pipeline. Questo parametro consente di inviare tramite pipe gli oggetti a Select-Object.

Quando si passano oggetti al parametro InputObject, anziché usare la pipeline, Select-Object considera InputObject come un singolo oggetto, anche se il valore è una raccolta. È consigliabile usare la pipeline quando si passano raccolte a Select-Object.

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

-Last

Specifica il numero di oggetti da selezionare dalla fine di una matrice di oggetti di input.

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

-Property

Specifica le proprietà da selezionare. Queste proprietà vengono aggiunte come membri NoteProperty agli oggetti di output. I caratteri jolly sono consentiti. Se l'oggetto di input non ha la proprietà denominata, il valore della nuova proprietà NoteProperty viene impostato su $null.

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

Le chiavi valide sono:

  • Nome (o Etichetta) - <string>
  • Espressione - <string> o <script block>

Per altre informazioni, vedere about_Calculated_Properties.

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

-Skip

Ignora (non seleziona) il numero specificato di elementi. Per impostazione predefinita, il parametro Skip conta dall'inizio della raccolta di oggetti. Se il comando usa il parametro Last , viene conteggiato dalla fine della raccolta.

A differenza del parametro Index , che inizia contando su 0, il parametro Skip inizia a 1.

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

-SkipLast

Ignora (non seleziona) il numero specificato di elementi dalla fine dell'elenco o della matrice. Funziona allo stesso modo dell'uso di Skip insieme al parametro Last .

A differenza del parametro Index , che inizia contando a 0, il parametro SkipLast inizia a 1.

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

-Unique

Specifica che se un subset degli oggetti di input ha proprietà e valori identici, deve essere selezionato solo un singolo membro del subset.

Seleziona i valori univoci dopo l'applicazione di altri parametri di filtro.

In questo parametro viene fatta distinzione tra maiuscole e minuscole. Di conseguenza, le stringhe che differiscono solo nell'uso delle maiuscole e minuscole vengono considerate univoche.

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

-Wait

Indica che il cmdlet disattiva l'ottimizzazione. PowerShell esegue i comandi nell'ordine in cui vengono visualizzati nella pipeline dei comandi e consente di generare tutti gli oggetti. Per impostazione predefinita, se si include un Select-Object comando con i parametri First o Index in una pipeline di comando, PowerShell arresta il comando che genera gli oggetti non appena viene generato il numero selezionato di oggetti.

Questo parametro è stato introdotto in Windows PowerShell 3.0.

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

Input

PSObject

È possibile inviare tramite pipe oggetti a questo cmdlet.

Output

PSObject

Questo cmdlet restituisce gli oggetti di input con solo le proprietà selezionate.

Note

Windows PowerShell include gli alias seguenti per Select-Object:

  • select

La funzionalità di ottimizzazione di Select-Object è disponibile solo per i comandi che scrivono oggetti nella pipeline durante l'elaborazione. Non ha alcun effetto sui comandi che memorizzano nel buffer gli oggetti elaborati e li scrivono come una raccolta. La scrittura immediata degli oggetti è una procedura consigliata di progettazione dei cmdlet. Per altre informazioni, vedere Scrivere record singoli nella pipeline in Linee guida per lo sviluppo fortemente incoraggiate.