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