PowerShell è un linguaggio potente. Ma cosa rende così potente questo linguaggio di scripting? Gli oggetti PowerShell. Cosa sono questi oggetti magici e come PowerShell interagisce con essi? Resta sintonizzato per scoprirlo.
PowerShell è un linguaggio di scripting orientato agli oggetti e una shell. Questo rappresenta una deviazione dalle shell tradizionali come cmd e Bash. Queste shell tradizionali si concentravano sul testo, ovvero stringhe, e sebbene siano ancora utili, sono limitate nelle loro capacità. Quasi tutto in PowerShell è un oggetto.
In questo articolo, imparerai alcuni concetti chiave relativi agli oggetti in PowerShell. Alla fine di questo articolo, avrai imparato come applicare questa conoscenza al tuo scripting attraverso esempi di codice utili e visualizzazioni.
Se sei più incline all’apprendimento visivo, sentiti libero di guardare il video correlato a questo articolo qui sotto.
Quindi preparati! Stai per vivere un’esperienza memorabile che ti aiuterà a padroneggiare il concetto di oggetti in PowerShell!
Prerequisiti
In questo articolo, imparerai gli oggetti in PowerShell attraverso un approccio pratico. Se decidi di seguire e provare gli esempi di codice, dovrebbe funzionare Windows PowerShell 5.1 o qualsiasi versione successiva di PowerShell 6+. Tuttavia, tutti gli esempi che vedrai verranno eseguiti su Windows 10 build 1903 con Windows PowerShell 5.1.
Comprensione dell’anatomia di un oggetto
Gli oggetti sono ovunque in PowerShell. Potresti chiederti: “Come appare un oggetto?” In questa prima sezione, avrai una panoramica di cosa è composto un oggetto. Una volta che avrai una visione generale di ciò che rende un oggetto un oggetto, potrai immergerti in alcuni esempi di codice!
Scoprire i membri dell’oggetto con Get-Member
Gli oggetti hanno molti tipi diversi di informazioni associate a loro. In PowerShell, queste informazioni vengono talvolta chiamate membri. Un membro di un oggetto è un termine generico che si riferisce a tutte le informazioni associate a un oggetto.
Per scoprire le informazioni su un oggetto (membri), puoi utilizzare il cmdlet Get-Member
. Il cmdlet Get-Member
è un comando utile che ti permette di trovare proprietà, metodi e così via disponibili per qualsiasi oggetto in PowerShell.
Ad esempio, supponiamo che tu voglia visualizzare i membri di un particolare oggetto restituito tramite il cmdlet Get-Service
. Puoi farlo inviando l’output del comando Get-Service
al cmdlet Get-Member
come mostrato di seguito.
Abituati al cmdlet Get-Member
. Lo userai molto in questo articolo.
Ogni comando in PowerShell che produce un output può essere inviato in input a
Get-Member
. Ricorda solo di inserire questo cmdlet come ultimo nella pipeline, poiché sovrascriverà l’output con il proprio output.
Tipi di oggetti e classi
Senza entrare in molti dettagli sulla programmazione orientata agli oggetti, ogni oggetto ha uno “schema”. Lo “schema” di un oggetto è una sorta di modello che contiene la configurazione per creare un oggetto. Quel modello è chiamato un tipo.
Ogni oggetto in PowerShell ha un tipo specifico. Ogni oggetto ha un modello da cui è stato creato. Un tipo di oggetto è definito da una classe. Considera questo esempio: il 9 è un numero, il Bluegill è un pesce, il Labrador è un cane, ecc. La classe viene prima del tipo.
Gli oggetti sono istanze di classi con un tipo specifico.
Non preoccuparti di approfondire troppo questo argomento. A meno che tu non sia uno sviluppatore di software, probabilmente non hai bisogno di preoccuparti troppo delle semantica a questo punto. Tuttavia, è un concetto importante da conoscere a un livello di base.
Proprietà
Il concetto più importante da capire sugli oggetti sono le proprietà. Le proprietà sono attributi che descrivono un oggetto. Un oggetto può avere molte proprietà diverse che rappresentano vari attributi.
Uno dei modi più semplici per scoprire quali proprietà esistono sugli oggetti è utilizzare il cmdlet Get-Member
. Come puoi vedere qui sotto, utilizzando il parametro MemberType
, Get-Member
limiterà l’output restituito solo agli oggetti. Vedrai anche che visualizza il tipo di oggetto System.ServiceProcess.ServiceController.

Ora prendi l’esempio del servizio BITS trattato in precedenza e vedi i valori specifici delle proprietà di quell’oggetto utilizzando il codice qui sotto. Il cmdlet Get-Member
ti permette di trovare i nomi delle proprietà ma non i valori. Tuttavia, utilizzando il cmdlet Select-Object
di PowerShell, puoi ispezionare i valori delle proprietà.
Qui sotto puoi vedere che StartType
è una proprietà dell’oggetto. L’oggetto restituito ha molti membri diversi ma utilizzando il cmdlet Select-Object
, si limita l’output a mostrare solo quella proprietà.

Le proprietà sono, di gran lunga, il componente più comune di un oggetto con cui lavorerai in PowerShell.
Alias
Alcune proprietà hanno un MemberType
di Alias
. Gli alias sono pseudonimi per i nomi delle proprietà. A volte possono dare alle proprietà un nome più intuitivo.
Puoi vedere un esempio di un oggetto con alias utilizzando nuovamente il cmdlet Get-Service
come mostrato di seguito. La proprietà Name
è alias di ServiceName
e RequiredServices
è alias della proprietà ServicesDependedOn
.

Quando una proprietà ha un alias, puoi fare riferimento al valore di quella proprietà utilizzando il nome dell’alias anziché il nome effettivo della proprietà. In questo esempio, un attributo descrittivo come Name
e RequiredServices
è più intuitivo e più facile da digitare rispetto a ServiceName
e ServicesDependedOn
.
Puoi vedere un esempio di riferimento a questi alias di seguito.
Dovresti vedere l’output seguente. Nota ancora che stai mantenendo il codice breve, pulito e conciso. Le informazioni sono le stesse, indipendentemente dall’uso o meno dell’alias:

Metodi
Le proprietà sono solo una parte che crea un oggetto; i metodi sono anche un concetto importante da comprendere. I metodi sono le azioni che possono essere eseguite su un oggetto. Come le proprietà, è possibile scoprire i metodi su un oggetto utilizzando il cmdlet Get-Member
.
Per limitare l’output di Get-Member
solo ai metodi, impostare il valore del parametro MemberType
su Method
come mostrato di seguito.

Come principiante, userai i metodi molto meno frequentemente rispetto alle proprietà.
Altri tipi di membri
Le proprietà, i metodi e gli alias non sono gli unici tipi di membri che un oggetto può avere. Tuttavia, saranno, di gran lunga, i tipi di membri più comuni con cui lavorerai.
Per completezza, di seguito sono riportati alcuni altri tipi di membri che potresti incontrare.
- Script Property – Queste vengono utilizzate per calcolare i valori delle proprietà.
- Note Property – Queste vengono utilizzate per nomi di proprietà statici.
- Set di proprietà: questi sono come alias che contengono esattamente ciò che il nome implica; insiemi di proprietà. Ad esempio, hai creato una proprietà personalizzata chiamata
Specs
per la tua funzioneGet-CompInfo
.Specs
è in realtà un sottoinsieme delle proprietà Cpu, Mem, Hdd, IP. Lo scopo principale dei set di proprietà è fornire un singolo nome di proprietà per concatenare un gruppo di proprietà.
È anche importante menzionare il concetto di eventi degli oggetti. Gli eventi sono al di fuori dello scopo di questo articolo.
Lavorare con gli oggetti in PowerShell
Ora che hai una comprensione di base di cosa consiste un oggetto, cominciamo a mettere le mani in pasta e a scrivere del codice.
Molti comandi di PowerShell producono output, ma a volte non hai bisogno di vedere tutto questo output. Devi limitare o manipolare in qualche modo quell’output. Fortunatamente, PowerShell ha alcuni comandi diversi che ti consentono di fare proprio questo.
Iniziamo con un esempio di enumerazione di tutti i servizi sul computer locale utilizzando il cmdlet Get-Service
come mostrato di seguito. Puoi vedere dall’output che vengono restituiti molti diversi servizi (oggetti).

Controllo delle proprietà degli oggetti restituiti
Continuando con l’esempio di Get-Service
, forse non hai bisogno di vedere ogni proprietà. Invece, hai solo bisogno di vedere le proprietà Status
e DisplayName
. Per limitare le proprietà restituite, useresti il cmdlet Select-Object
.
Il cmdlet Select-Object
“filtra” varie proprietà restituite al pipeline di PowerShell. Per “filtrare” le proprietà dell’oggetto da restituire, è possibile utilizzare il parametro Property
e specificare un insieme di una o più proprietà separate da virgole.
Puoi vedere qui sotto un esempio di restituzione solo delle proprietà Status
e DisplayName
.

Ordinamento degli oggetti
Forse stai creando un rapporto per mostrare i servizi e il loro stato. Per una facile consultazione delle informazioni, vorresti ordinare gli oggetti restituiti per il valore della proprietà Status
. Per farlo, puoi utilizzare il cmdlet Sort-Object
.
Il cmdlet Sort-Object
ti consente di raccogliere tutti gli oggetti restituiti e quindi restituirli nell’ordine che definisci.
Ad esempio, utilizzando il parametro Property
di Sort-Object
, puoi specificare una o più proprietà sugli oggetti in ingresso da Get-Service
su cui ordinare. PowerShell passerà ogni oggetto al cmdlet Sort-Object
e quindi li restituirà ordinati per il valore della proprietà.
Puoi vedere qui sotto un esempio di restituzione di tutti gli oggetti di servizio ordinati per la loro Status
correttamente restituita in ordine decrescente utilizzando il parametro di interruttore Descending
di Sort-Object
.

Il tubo [
|
] in PowerShell è una delle poche tecniche di continuazione di linea che dovresti usare quando necessario. Usalo invece dei backtick.
Filtraggio degli oggetti
Forse hai deciso di non voler visualizzare tutti i servizi su una macchina. Invece, devi limitare l’output in base a criteri specifici. Un modo per filtrare il numero di oggetti restituiti è utilizzare il cmdlet Where-Object
.
Mentre il cmdlet Select-Object
limita l’output di proprietà specifiche, il cmdlet Where-Object
limita l’output di interi oggetti.
Il cmdlet Where-Object
è simile nella funzione alla clausola SQL WHERE. Funziona come un filtro della fonte originale per restituire solo gli oggetti che corrispondono a criteri specifici.
Forse hai deciso di voler restituire solo gli oggetti con un valore di proprietà Status
di Running
e solo quelli con un valore di proprietà DisplayName
che inizia con A
.
Puoi vedere nel frammento di codice successivo che è stata inserita una referenza a Where-Object
tra Select-Object
e Sort-Object
nell’ordine della pipeline. Utilizzando un valore di script block con una condizione richiesta creata per ogni oggetto da soddisfare tramite il parametro FilterScript
, puoi creare qualsiasi tipo di query desideri.
Dai un’occhiata al cmdlet
Format-Table
se vuoi manipolare come viene restituito l’output alla console.

Conta e calcola la media degli oggetti restituiti
Il comando Get-Service
restituisce molti oggetti diversi. Utilizzando il cmdlet Where-Object
, hai filtrato una parte di quegli oggetti, ma quanti? Ecco il cmdlet Measure-Object
.
Il cmdlet Measure-Object
è un comando di PowerShell che, tra le altre operazioni matematiche, può contare quanti oggetti riceve tramite il pipeline.
Forse vorresti sapere quanti oggetti vengono alla fine restituiti quando i tuoi comandi combinati vengono eseguiti. Puoi indirizzare l’output finale al cmdlet Measure-Object
per trovare il numero totale di oggetti restituiti come mostrato di seguito.
Una volta completate le elaborazioni dei comandi, vedrai, in questo caso, che sono stati restituiti 21 oggetti creati inizialmente con il cmdlet Get-Service
.

Forse stai cercando solo il totale degli oggetti restituiti. Poiché il comando Measure-Object
restituisce il totale degli oggetti trovati tramite una proprietà Count
, puoi fare riferimento nuovamente al cmdlet Select-Object
. Ma questa volta, restituendo solo la proprietà Count
.

Agire sugli oggetti con cicli
Mentre ogni oggetto viene elaborato tramite il pipeline, puoi agire su ciascun oggetto con un ciclo. Ci sono diversi tipi di cicli in PowerShell, ma rimanendo sugli esempi di pipeline, vediamo il cmdlet ForEach-Object
.
Il cmdlet ForEach-Object
ti consente di agire su ciascun oggetto che fluisce in esso. Questo comportamento è meglio spiegato con un esempio.
Continuando a utilizzare un esempio con Get-Service
, forse vorresti trovare tutti i servizi su un computer Windows con un nome che inizia con “Windows” e che è in esecuzione. Utilizzando il cmdlet Where-Object
, puoi creare le condizioni come hai fatto in precedenza.
Ma ora, invece di restituire interi oggetti o anche alcune proprietà, vorresti restituire la stringa <NomeServizio> è in esecuzione per ogni oggetto utilizzando il codice **Write-Host -ForegroundColor 'Yellow' <NomeServizio> "è in esecuzione"
.
Stai ora manipolando l’output e creando la tua stringa. L’unico modo per farlo è utilizzare il cmdlet ForEach-Object
, come mostrato di seguito. Qui puoi vedere che per ogni oggetto restituito tramite Where-Object
, PowerShell esegue il codice Write-Host -ForegroundColor 'Yellow' $_.DisplayName "è in esecuzione"
.

Il cmdlet ForEach-Object
è utile in molti modi. Ad esempio, potresti integrare una logica aggiuntiva per enumerare ogni oggetto servizio trovato e in base al valore di una proprietà, cambiare il colore e il testo della stringa di output o addirittura eseguire un’azione aggiuntiva come avviare un servizio interrotto.
Immagina le possibilità che ciò ti offre! Con un po’ di riflessione e pianificazione, potresti creare uno script che prende un comando ed esegue facilmente la stessa operazione su molti oggetti.
Confronto tra Oggetti
A volte è necessario confrontare i valori delle proprietà di due oggetti.
Forse hai due sistemi nella tua rete che sono quasi identici. Tuttavia, stai riscontrando quello che pensi sia un problema di configurazione con un servizio su uno dei due sistemi.
Concludi che poiché questi sistemi sono in parti diverse della tua rete, dovrai utilizzare comandi remoti per raccogliere le informazioni in una sessione di PowerShell. Apri il tuo editor preferito e crei uno script. Questo script, come puoi vedere di seguito, si connette a due server diversi ed enumera tutti i processi su ciascuno di essi.
Hai ora catturato tutti i processi su ciascun computer nelle variabili $ProcA
e $ProcB
. Ora devi confrontarli. Potresti guardare manualmente attraverso ogni set di processi o potresti farlo nel modo più semplice usando un cmdlet chiamato Compare-Object
.
Compare-Object
ti consente di confrontare i valori delle proprietà di due oggetti diversi. Questo cmdlet legge ogni proprietà in ciascun oggetto, guarda i loro valori e restituisce ciò che è diverso, per impostazione predefinita, e anche ciò che è uguale.
Per utilizzare Compare-Object
, specifica un parametro ReferenceObject
e un parametro DifferenceObject
, fornendo ciascun oggetto come valori del parametro come mostrato di seguito.
In modo predefinito, Compare-Object
restituirà solo le differenze negli oggetti indicate dalla proprietà SideIndicator
. I simboli o indicatori laterali utilizzati sono >
, <
, & =
per mostrare le corrispondenze degli oggetti confrontati.

Puoi utilizzare il parametro
IncludeEqual
conCompare-Object
per restituire le proprietà degli oggetti che sono uguali. In tal caso, vedrai==
come indicatore laterale. Allo stesso modo, puoi utilizzareExcludeDifferent
per escludere le differenze.
Il cmdlet Compare-Object
è un cmdlet molto utile. Se desideri saperne di più, assicurati di visitare la documentazione online.
Lavorare con oggetti personalizzati
Ora che hai una buona comprensione di cosa sono gli oggetti e come puoi lavorare con essi, è il momento di creare i tuoi oggetti personalizzati!
Creare oggetti personalizzati da hashtable
Un modo per creare i tuoi oggetti personalizzati è utilizzare gli hashtable. Gli hashtable sono insiemi di coppie chiave/valore, esattamente ciò di cui hai bisogno per creare le proprietà di un oggetto.
Iniziamo creando un oggetto personalizzato di PowerShell con alcune chiavi/valori utilizzando un hashtable. Nell’esempio seguente, stai creando un hashtable che rappresenta un singolo oggetto e le sue proprietà. Una volta definito l’hashtable $CarHashtable
, puoi utilizzare l’acceleratore di tipo PsCustomObject
per eseguire il cast.
Il tipo acceleratore pscustomobject è un modo rapido per creare un’istanza della classe pscustomobject. Questo comportamento è chiamato casting.
Alla fine del frammento di codice seguente, avrai un oggetto ($CarObject
) di tipo pscustomobject con cinque proprietà assegnate ad esso.
In alternativa, è anche possibile utilizzare il cmdlet New-Object
. Utilizzando la stessa hashtable, anziché utilizzare l’acceleratore di tipo pscustomobject, è possibile farlo nel modo lungo con New-Object
. Di seguito è mostrato un esempio di ciò.
Quando viene creato $CarObject
, è possibile vedere di seguito che è possibile fare riferimento a ciascuna delle proprietà come se provenisse da un cmdlet di PowerShell incorporato come Get-Service
.

Aggiunta e rimozione di proprietà
Non solo è possibile creare oggetti personalizzati, ma è anche possibile aggiungere proprietà ad essi. Ti ricordi di aver utilizzato il cmdlet Get-Member
? Get-Member
ha un relativo chiamato Add-Member
. Il cmdlet Add-Member
non elenca i membri, li aggiunge.
Utilizzando l’oggetto personalizzato creato in precedenza come esempio, forse desideri aggiungere una proprietà relativa all’anno di modello a quell’oggetto. Puoi farlo passando un oggetto a Add-Member
specificando:
- Il tipo di membro (in questo caso un semplice
NoteProperty
) - Il nome della proprietà (
Year
) - Il valore della proprietà (
Value
)
Puoi vedere un esempio di ciò di seguito.
Puoi vedere di seguito che appare come qualsiasi altra proprietà.

Puoi utilizzare tecniche simili per aggiungere molti tipi diversi di membri. Se desideri esplorare ulteriormente da solo, dai un’occhiata alla documentazione
di Add-Member
.
Puoi rimuovere facilmente un membro da un oggetto. Anche se non esiste un cmdlet Remove-Member
, puoi comunque farlo chiamando il metodo Remove()
sull’oggetto come mostrato di seguito. Imparerai di più sui metodi nella prossima sezione.
Breve introduzione ai metodi
In tutto questo articolo, hai lavorato con le proprietà. Hai letto i valori delle proprietà, creato le tue proprietà e le hai aggiunte e rimosse. Ma non hai fatto molto all’ambiente. Non hai cambiato nulla sul server. Prendiamo qualche azione con i metodi.
I metodi eseguono qualche tipo di azione. Gli oggetti memorizzano informazioni mentre i metodi intraprendono azioni.
Ad esempio, potresti essere a conoscenza del comando Stop-Service
. Questo comando ferma un servizio di Windows. Per farlo, puoi inviare direttamente un oggetto da Get-Service
a Stop-Service
per farlo accadere.
Di seguito puoi vedere un esempio di come arrestare il servizio BITS. Questo esempio arresta il servizio BITS e quindi controlla lo stato per assicurarsi che sia fermo. Hai eseguito due azioni con i cmdlet; l’arresto del servizio e il controllo dello stato.
Invece di eseguire Get-Service
due volte ed eseguire un comando separato, Stop-Service
, puoi invece sfruttare i metodi integrati negli oggetti del servizio. Molti oggetti hanno dei metodi. In questo caso, Stop-Service
e nemmeno il secondo riferimento a Get-Service
sono necessari.

Invocando i metodi direttamente sull’oggetto del servizio, puoi arrestare e ottenere lo stato aggiornato, tutto utilizzando un singolo oggetto. Di seguito puoi vedere questo in azione. Nota che utilizzando i metodi Stop()
e Start()
, puoi manipolare il servizio proprio come hanno fatto i comandi.
Per assicurarti che il valore della proprietà Status
sia aggiornato dopo che lo stato del servizio è cambiato, puoi invocare il metodo Refresh()
che agisce come un’altra chiamata al comando Get-Service
.
Dovresti vedere il seguente output:

Per ulteriori informazioni sui metodi, consulta l’argomento di aiuto su_Methods.
Conclusione
Ci sono molte cose che puoi fare con gli oggetti in PowerShell. Questo articolo è solo un’introduzione per aiutarti a iniziare a conoscerli. In questo articolo hai appreso alcuni concetti di base su cosa sono gli oggetti, come agire su di essi, manipolarli e crearli. Hai visto alcuni scenari diversi che ti hanno mostrato come eseguire queste attività con esempi di codice. Rimanete calmi e imparate PowerShell. Grazie per la lettura!