Windows PowerShell. I molti modi per creare un oggetto personalizzato

Non importa quale approccio si sceglie per l'output di oggetti personalizzati, come un oggetto personalizzato è il risultato finale.

Don Jones

Recentemente, ho scritto un post sul blog che delinea una serie di 12 consigliate per l'utilizzo di Windows PowerShell. Il No. 12 migliori prassi dirige la gente per gli oggetti da loro script e funzioni, invece di mostrare il testo di output. Sono andato finora come a suggerire che se mai sono state utilizzando il cmdlet Write-Host, dovrebbe un passo indietro e pensare a quello che stavi facendo. Write-Host tutti fa è produrre un testo.

Non molto tempo dopo quel post è andato in diretta, un lettore mi ha contattato circa il codice che avevo usato per creare effettivamente l'oggetto personalizzato. Ha detto che non aveva mai visto quell'approccio prima. Che è stato sorprende, come Windows PowerShell sembra offrire decine di modi diversi di fare nulla. Ha suggerito di scrivere un articolo sui diversi modi per produrre un oggetto personalizzato, così qui siamo.

Il modo in forma integrale

Questo è il modo in cui che la maggior parte delle persone sarebbero probabilmente scegliere di creare un oggetto personalizzato. È quello che io chiamo il "approccio manuale". Ha il vantaggio di essere abbastanza chiaro, anche se si tratta di un sacco di battitura. Supponendo di che avere un oggetto nella variabile $os e un altro nel bios $, potrei combinare pezzi selezionati delle informazioni da loro come questo:

$object = New-Object –TypeNamePSObject $object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber $object | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version $object | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber Write-Output $object

È possibile continuare tale pattern per aggiungere qualunque altre informazioni necessarie per l'oggetto di output finale, prima di scriverlo alla pipeline.

-PassThru: Un breve collegamento

Si può fare un po ' più concisa quel primo approccio raccontando Add-Member per rimettere l'oggetto nella pipeline:

$object = New-Object –TypeNamePSObject $object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber –PassThru | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version –PassThru | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber Write-Output $object

Quando si termina una linea con un carattere pipe, Windows PowerShell sa andare alla riga successiva fisica per cercare il comando successivo nella pipeline. Essenzialmente, si tratta di un modo di rompere un comando lungo in più righe fisiche. Quel trucco, combinato con l'interruttore PassThru, rende questo una serie di tre comandi distinti.

Hashtable a go-go

Gli approcci precedenti sono efficaci, ma sono anche molto prolisso. In uno script, in realtà può essere difficile per voi per visivamente determinare ciò che sta accadendo. Utilizzando la funzionalità oggetto nuovo è un approccio più conciso. Questo consente di creare un oggetto hashtable (o un array associativo) che contiene i nomi di proprietà e valori che si desidera aggiungere all'oggetto appena creato. Queste proprietà vengono ciascuno create automaticamente come NoteProperty:

$properties = @{'OSBuild'=$os.BuildNumber; 'OSVersion'=$os.version; 'BIOSSerial'=$bios.SerialNumber} $object = New-Object –TypeNamePSObject –Prop $properties Write-Output $object

Questo ha lo stesso effetto, ma è molto più conciso. Qualche gente intelligente userà un'espressione tra parentesi per renderlo ancora più breve. Tuttavia, penso che questo lo rende un po' più difficile da leggere:

$object = New-Object –TypeNamePSObject –Prop (@{'OSBuild'=$os.BuildNumber; 'OSVersion'=$os.version; 'BIOSSerial'=$bios.SerialNumber}) Write-Output $object

Andando un po' più

Si noterà che in tutti questi esempi, salvare l'oggetto personalizzato a una variabile (oggetto$) prima di scriverlo alla pipeline. La ragione di questo è semplice. Si potrebbe voler modificare l'oggetto di un po' di più. Ad esempio, si potrebbe voler dare l'oggetto di un nome di tipo personalizzato:

$object.PSObject.TypeNames.Insert(0,'My.Custom.Name')

Facendo questo consente di creare layout per visualizzare l'oggetto di formattazione personalizzate predefinite. Ho usato questo trucco di grande effetto in "Windows PowerShell Scripting e utensili" (concentrato di tecnologia e formazione tecnica di interfaccia, 2011), un piccolo libro che ho scritto che si concentra sulle cose come l'utilizzo di oggetti personalizzati come output da strumenti di Windows PowerShell su misura.

Differenti colpi per gente diversa

Non non c'è alcun modo "sbagliato" per fare nulla in Windows PowerShell, fintanto che il vostro approccio ottiene il lavoro fatto. Detto questo, ci sono alcuni approcci evitare, soprattutto perché sono meno leggibile e più difficile da insegnare — specialmente ai neofiti. Ecco uno, ancora assumendo che mio os $ e $ variabili del bios contengano gli oggetti crudi che voglio estrarre informazioni da:

$os | Select-Object –Property @{n='OSVersion';e={$_.Version}}, @{n='OSBuild';e={$_.BuildNumber}}, @{n='BIOSSerial';e={$bios.SerialNumber}}

Voi avrete generare gli stessi risultati degli esempi precedenti, ma la sintassi è spaventosa. C'è un sacco di punteggiatura, un sacco di struttura e si deve capire molto di che cosa sta facendo con quei tre Hashtable Select-Object.

Esso è fondamentalmente generando proprietà personalizzate utilizzando una sintassi unica per quel cmdlet (e condivisa dai cmdlet Format). Vedrai che sintassi utilizzata dalla gente con un background di stile di sviluppo software. È più difficile per me (e molte altre persone) analizzare mentalmente, così io tendo a non usarlo tanto.

PowerShell è nulla se non flessibile

Windows PowerShell è unico in quanto consente di ottenere via con alcuni pazzie. Ad esempio, risalgono al mio esempio hashtable. Si potrebbe anche fare in questo modo:

$info = @{} $info.OSBuild=$os.BuildNumber $info.OSVersion=$os.version $info.BIOSSerial=$bios.SerialNumber $object = New-Object –TypeNamePSObject –Prop $info Write-Output $object

Stai creando una hashtable vuota, quindi l'aggiunta di informazioni facendo riferimento alle proprietà che non esistono. Quando si tenta prima di accedere a OSBuild, ad esempio, Windows PowerShell realizza che nessuna di tali proprietà esiste nell'oggetto $info (che era una hashtable vuota). Implicitamente crea la proprietà e assegna il valore. Pazzie — ma funziona.

Gli stand morali: Gli oggetti non testo

Tuttavia si sceglie di creare oggetti personalizzati, è possibile creare oggetti personalizzati anziché l'output di testo semplice nella finestra di console. Gli oggetti sono infinitamente più flessibili, e hanno lasciato l'output di script o una funzione di integrare con tutto altro Windows PowerShell.

Don Jones

Don Jonesè un Microsoft MVP Award destinatario e autore di "Imparare Windows PowerShell in un mese di pranzi" (Manning Publications, 2011), un libro progettato per aiutare ogni amministratore di diventare efficace con Windows PowerShell. Jones offre anche la formazione di Windows PowerShell pubblici e in loco. Contattarlo tramite il suo sito Web all'indirizzo ConcentratedTech.com.

Contenuti correlati