
Creare oggetti custom in PowerShell
Dalla PowerShell versione 3 è possibile creare degli oggetti custom in modo semplice tramite l'uso delle hash table e cast ad oggetto:
 
Il trucco è quello di creare un hash table @{} valorizzato con i nomi e valori che le proprietà devono avere
 
poi fare un cast ad un oggetto 
 
l'oggetto PSCustomObject è un oggetto vuoto pensato per questo utilizzo.
 
Se creo una serie di oggetti, ad esempio in un ciclo ForEach-Object (%), in realtà sto creando una collection di oggetti. Questi saranno disponibili in output e potranno essere passati, tramite la pipe (|), in input al successivo comando.
In questo esempio leggo una directory e mi faccio restituire un oggetto custom che ha 2 proprietà, il nome del file (FileName) e la sua lunghezza (FileLen):
 
da un risultato simile a questo
 
poi posso ad esempio filtrare con una Where-Object (punto di domanda) per selezionare solo quelli che hanno il nome file più lungo di 30 caratteri:
 
da come risultato:
 
 
da come risultato
 
    PowerShell
$obj = [PSCustomObject]@{Name="Test"; Positon=1; Date=(Get-Date)}
PowerShell
@{Name="Test"; Positon=1; Date=(Get-Date)}
PowerShell
[PSCustomObject]@{Name="Test"; Positon=1; Date=(Get-Date)}
I nomi dalle proprietà sono separati dai valori tramite un simbolo uguale (=), mentre le proprietà sono separate tra di loro da un punto e virgola (;)
 Il risultato a video è questo:Text
Name Positon Date
---- ------- ----
Test       1 04/02/2016 22:18:44
Se creo una serie di oggetti, ad esempio in un ciclo ForEach-Object (%), in realtà sto creando una collection di oggetti. Questi saranno disponibili in output e potranno essere passati, tramite la pipe (|), in input al successivo comando.
In questo esempio leggo una directory e mi faccio restituire un oggetto custom che ha 2 proprietà, il nome del file (FileName) e la sua lunghezza (FileLen):
PowerShell
$d = dir | %{ $l=$_.Name.length; [PSCustomObject]@{FileName=$_.Name; FileLen=$l} }
$d
Text
FileName                                                            FileLen
--------                                                            -------
Blocchi appunti di OneNote                                               26
Fiddler2                                                                  8
File di Outlook                                                          15
File ricevuti                                                            13
Forme personalizzate                                                     20
Graphics                                                                  8
...
PowerShell
$d | ? {$_.FileLen -gt 30 }
Text
FileName                                                            FileLen
--------                                                            -------
Modelli di Office personalizzati                                         32
RemoteDesktopConnections.rdg.old                                         32
SpecificheSistemadiintegrazionedocumentale (DRAFT -1 20141201).docx      67
Alternativa
In alternativa posso creare un oggetto tramite New-Object:PowerShell
# creo un hash table con le proprietà
$props = @{Name="Test"; Positon=1; Date=(Get-Date)}
# volendo posso aggiungere altre proprietà
$props.Valore1 = "AA";
$props["Valore2"] = "BB"
# lo converto in oggetto
$obj = New-Object -TypeName PSObject -Property $props
# lo visualizzo
$obj | Select Name, Position, Date, Valore1, Valore2 | format-Table
Text
Name Position Date                Valore1 Valore2
---- -------- ----                ------- -------
Test          04/02/2016 22:38:44 AA      BB