Come utilizzare la proprietà di espansione di PowerShell per Select-Object

Il cmdlet Select-Object di PowerShell ti consente di selezionare agilmente oggetti e proprietà da un gruppo di oggetti di input. Ma a volte devi semplicemente sapere di più. ExpandProperty è uno switch per Select-Object che espande i dettagli su una particolare proprietà.

Scopri il potere dello switch PowerShell Expand Property (-ExpandProperty) in questo tutorial guidato da esempi.

Prerequisiti

Questo tutorial sarà una dimostrazione pratica. Se desideri seguirci, tutto ciò di cui hai bisogno è una macchina Windows con PowerShell 5.1 e versioni successive. Questo articolo utilizza una macchina Windows 10 con PowerShell 5.1.

Estrarre i valori degli oggetti di proprietà con PowerShell Expand Property

Accedi alla tua macchina Windows e avvia un terminale PowerShell. In questa sezione, ti familiarizzerai con il cmdlet Select-Object e il suo switch ExpandProperty.

1. Esegui il cmdlet Get-Service per ottenere un elenco di tutti i servizi sul tuo sistema. Inoltra l’output al cmdlet Select-Object per selezionare e visualizzare solo la proprietà del nome di ogni oggetto di servizio, come mostrato di seguito.

Get-Service | Select-Object -Property Name

Dovresti ora vedere una singola colonna di oggetti che rappresentano un elenco di nomi di servizi sul tuo sistema, come nella schermata troncata qui sotto.

Selecting the names of the existing system services

2. Esegui il cmdlet Get-Member alla fine del precedente pipeline per confermare il tipo di oggetti restituiti da select-object come di seguito. Conoscere il tipo di oggetto aiuta a scrivere funzioni o cmdlet per estendere le tue pipeline.

Get-Service | Select-Object -Property Name | Get-Member

Consulta lo screenshot qui sotto e noterai che, nonostante lo switch -Property produca ciò che sembra essere un elenco di stringhe, queste sono l’elenco Selezionato degli oggetti System.ServiceProcess.ServiceController.

Viewing the type of a ServiceController object with Get-Member

3. Sostituisci il cmdlet Get-Members con mkdir per creare automaticamente una cartella per ogni servizio. Lo switch -first 5 limita il numero di oggetti da restituire. A sua volta, la funzione mkdir creerà solo cinque cartelle basate sugli oggetti nella pipeline.

Get-Service | Select-Object -Property Name -First 5 | mkdir

Dovresti vedere un output simile allo screenshot qui sotto, che indica il tentativo riuscito.

Creating a folder for the services on your system

4. Rimuovi le cartelle sostituendo mkdir con rmdir come nello snippet qui sotto. Attiva lo switch -Verbose per mostrare output dettagliati nel tuo terminale.

Get-Service | Select-Object -Property Name -First 5 | rmdir -Verbose

Il cmdlet rmdir si aspetta delle stringhe e non può gestire la rappresentazione hashtable degli oggetti ServiceController. Il tuo tentativo dovrebbe fallire con diversi errori, come nello screenshot qui sotto.

Demonstrating that some cmdlets expect string values instead of hashtables

5. Cambia l’interruttore -Property con l’interruttore -ExpandProperty come nello snippet seguente. Facendo ciò ti permette di ottenere il valore di una proprietà come stringa quando tutto ciò di cui hai bisogno è una stringa.

Get-Service | Select-Object -ExpandProperty Name -First 5 | rmdir -Verbose

Unito a rmdir, dovresti vedere che il tuo tentativo di rimuovere automaticamente le cartelle avviene senza errori, come nello screenshot qui sotto.

Deleting folders named after the services expanded

Creare un Set di Oggetti Selezionati con Proprietà Specifiche

Per abbreviare gli snippet di codice nelle sezioni, crea una variabile per i primi 20 servizi sulla tua macchina come segue.

Esegui il comando Get-Service, seleziona i primi 20 oggetti tramite il cmdlet Select-Object, e memorizza gli oggetti in una variabile chiamata $testServices. Seleziona solo le proprietà Name, Status, e DependentServices come segue.

$testServices = Get-Service | Select-Object -Property Name,Status,DependentServices -First 20

L’interruttore PowerShell Expand Property può espandere solo una proprietà alla volta, a differenza dell’interruttore Property, che può selezionare più di una proprietà contemporaneamente.

Esegui il nome della variabile, `$testServices`, per visualizzare la struttura dei suoi contenuti.

$testServices

Dovresti vedere una tabella che mostra le proprietà dei servizi che hai selezionato, simile allo screenshot qui sotto.

Displaying the contents of $testServices

Espandendo una Proprietà di Collezione con PowerShell Espandi Proprietà

A PowerShell object can have properties that are collections of objects, also known as collection properties. In this section, you will learn how to use PowerShell Expand Property to expand a collection property to view its members’ properties.

Esegui il cmdlet Select-Object sulla variabile $testServices ed espandi la proprietà DependentServices di ogni servizio.

$testServices | Select-Object -ExpandProperty DependentServices

Dato che DependentServices è una proprietà di collezione, l’output è una lista dei servizi in tutte le collezioni popolate, come mostrato di seguito. Nota i duplicati nella lista a causa della concatenazione dei risultati dal DependentServices espanso.

Expanding the DependentServices property

Combinazione di Proprietà con PowerShell Espandi Proprietà per Output Categorizzato

Ora hai una lista di servizi dipendenti, ma come fai a sapere da quale servizio dipendono? In questa sezione, imparerai a utilizzare lo switch -Property per categorizzare una proprietà espansa.

Esegui il comando qui sotto per categorizzare le proprietà DependentServices per Name.

$testServices | Select-Object -ExpandProperty DependentServices -Property Name

Dato che i servizi dipendenti hanno già una proprietà Name, lo step di categorizzazione fallisce, come mostrato di seguito.

L’errore qui sotto ti informa che la lista iniziale di servizi (in $testServices) ha già una proprietà Nome in conflitto con una proprietà Nome nella proprietà DependentServices espansa.

Attempting to group an expanded property by the parent object name

Un workaround consiste nel creare Proprietà Calcolate per rinominare la proprietà identificatore come segue.

Salva l’output del comando precedente modificato per specificare una proprietà calcolata chiamata Dipende Da come la proprietà identificatore in una variabile chiamata $depServ. Dipende Da conterrà il valore Nome per ogni servizio in $testService.

Il nome della proprietà, Dipende Da, è stato scelto arbitrariamente in questo tutorial e può essere qualsiasi espressione a tua scelta.

$depServ = $testServices | Select-Object -ExpandProperty DependentServices -Property @{name="Depends On"; expr={$_.Name}}

Passa l’oggetto in $depServ attraverso Select-Object per selezionare le proprietà del servizio dipendente Nome, Stato, e Dipende Da.

$depServ | Select-Object -Property Name,Status,"Depends On"

Ora puoi capire quali servizi dipendono dai servizi in $testServices, come mostrato di seguito.

Grouping an expanded property using a calculated property

Combina Format-List con PowerShell Expand Property per la Verbosità

PowerShell potrebbe limitare quali proprietà dell’oggetto mostrare, specialmente in output tabellare, e lo switch -ExpandProperty potrebbe avere lo stesso problema. Potresti mostrare le proprietà espandibili in un elenco invece che come soluzione alternativa.

Esegui il cmdlet Get-Process di seguito per recuperare tutti i moduli che il processo explorer utilizza. Attiva lo switch -ExpandProperty per mostrare le proprietà dei moduli.

Get-Process explorer | select-object -ExpandProperty Modules

L’output sullo schermo dovrebbe assomigliare alla seguente schermata, automaticamente troncato per mostrare solo tre proprietà.

Viewing the truncated output of an expanded property

Pipea gli oggetti al cmdlet Format-List per visualizzare tutti i valori degli oggetti modulo in un elenco più gestibile.

Get-Process explorer | select-object -ExpandProperty Modules | Format-List

Come mostrato di seguito, l’output elenca tutte le proprietà e i loro valori. Puoi ulteriormente salvare i dati in un file o passarli a un altro cmdlet per ulteriori elaborazioni.

Converting the output of an expanded property to a list with Format-List

Conclusion

Avendo raggiunto con successo questo punto, hai visto come trarre beneficio dallo switch di proprietà di espansione di PowerShell (-ExpandProperty) del cmdlet Select-Object. PowerShell offre una serie di utili cmdlet per molte attività comuni. Puoi arricchire le tue nuove conoscenze imparando come visualizzare rapidamente i file con PowerShell Cat.

Source:
https://adamtheautomator.com/powershell-expand-property/