PowerShell è una shell con interfaccia a riga di comando sviluppata da Microsoft e caratterizzata da un potente linguaggio di scripting. Windows PowerShell è già integrato nel sistema operativo (in Windows 10 è diventata la finestra del terminale predefinita premendo la combinazione di tasti Windows+X
) e ne esiste anche una versione cross platform un po’ più limitata nelle funzionalità ma compatibile anche con i sistemi macOS e Linux: PowerShell 7 disponibile per Windows, macOS e Linux: le novità.
Nell’articolo Windows PowerShell, come funziona l’interfaccia che sostituisce il prompt dei comandi avevamo descritto “i fondamentali” di PowerShell mentre in altri articoli abbiamo visto come usare vari tipi di script per gestire esigenze concrete: vedere queste pagine.
Nell’articolo Gestire PC in rete locale con PowerShell abbiamo spiegato, addirittura, come configurare e amministrare i sistemi collegati alla rete locale.
Anche nel recente approfondimento Bloccare accesso Internet per un programma Windows, abbiamo presentato due script che consentono di interagire con la configurazione del sistema operativo e in particolare aggiungere ed eliminare regole firewall in entrata e in uscita.
La potenza della pipeline di PowerShell: interagire con file e cartelle
La potenza di PowerShell risiede nella possibilità di usare la cosiddetta pipeline. Similmente a quanto avviene su Linux, combinando più comandi PowerShell e separandoli con il simbolo |
è possibile eseguire attività anche molto complesse e articolate.
Si prenda come esempio quanto segue:
Il primo comando, quello a sinistra della pipe (|
), provvede ad estrarre l’elenco di tutti i file con estensione .docx
contenuti nella cartella C:\Users
e in tutte le eventuali sottocartelle (-Recurse
).
L’output prodotto da questo primo comando viene passato a valle ed elaborato dal comando che segue più a destra. In questo caso Select-Object
provvede ad elaborare quanto ricevuto da Get-ChildItem
e ad estrarre esclusivamente directory e nomi dei file (colonne Directory e Name).
Aggiungendo anche | Export-CSV $env:userprofile\Desktop\file_docx.csv
la lista dei file .docx
sarà memorizzata in un file CSV gestibile con Excel o LibreOffice Calc.
Con la stringa $env:userprofile
si è richiesto di utilizzare la ben nota variabile d’ambiente %userprofile%
: nell’esempio il file CSV viene così generato e salvato nella cartella Desktop dell’account utente correntemente in uso.
Per creare invece un file HTML con l’output del comando Select-Object
, basta invece usare | ConvertTo-Html > $env:userprofile\Desktop\file_docx.html
.
Con un approccio del genere è possibile effettuare elaborazioni su qualunque genere di output o addirittura lavorare sul contenuto di file di testo e CSV.
I comandi da usare in questo caso sono Get-Content
e Import-CSV
.
Prendiamo in esame il primo script PowerShell nell’articolo Bloccare accesso Internet per un programma Windows.
Dapprima si crea una variabile $d
memorizzandovi la stringa C:\TEMP
. Immediatamente a destra, si è usato il carattere ;
per indicare che l’istruzione finisce in questo punto (non c’è alcun output da passare ai comandi a destra).
Con il comando Get-ChildItem
già visto in precedenza, si estraggono tutti i dati relativi ai file eseguibili contenuti nel percorso indicato (variabile $d
). Ciò che si ottiene è un output paragonabile a quello prodotto dai comandi dir
e ls
.
Proseguendo a destra, l’output viene elaborato da Select-Object
che non soltanto estrae solo il nome del file eseguibile ma usa -ExpandProperty
per rimuovere tutti i dati aggiuntivi e ottenere una stringa con il solo nome del file.
Il successivo comando ForEach-Object
consente di eseguire l’operazione specificata tra parentesi graffe per ciascuno dei nomi di file estratti. In questo caso lo script PowerShell crea una nuova regola firewall usando il comando New-NetFirewallRule
.
La variabile $_
viene utilizzata per passare il nome del file estratto con il precedente comando.
Come leggere dati dal registro di sistema con PowerShell
Provate a utilizzare il comando seguente dalla finestra di PowerShell:
Si otterrà la lista dei programmi installati in Windows estratta leggendo il contenuto della chiave del registro HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
. Come si vedrà, però, l’output risulterà pressoché illeggibile.
Anche in questo caso si può quindi ricorrere alla pipeline e al comando Select-Object
per estrarre le informazioni che interessano:
Nell’esempio abbiamo scelto di raccogliere il nome del programma installato, il numero di versione, lo sviluppatore e la data di installazione. Usando i comandi Export-CSV
e ConvertTo-Html
visti in precedenza si può produrre l’elenco dei software installati in formato CSV o HTML.
Interagire con il registro degli eventi, i servizi di sistema e gli aggiornamenti installati
Con i comandi PowerShell Get-Eventlog
e Get-Service
si può interagire, rispettivamente, con le informazioni memorizzate nel registro degli eventi di Windows (Windows+R
, eventvwr.msc
) e con la lista dei servizi installati nel sistema operativo.
Il comando Where-object
è utile per selezionare quegli elementi che rispondono al criterio impostato.
Digitando il comando PowerShell Get-HotFix
si ottiene la lista degli aggiornamenti installati sul sistema.
Scrivendo quanto segue, per esempio, si può verificare se l’aggiornamento contraddistinto dall’identificativo KB4534132 sia installato o meno:
Si è chiesto cioè di estrarre le eventuali voci per le quali, nella colonna HotfixID, figuri in questo caso la stringa KB4534132
.
La sintassi utilizzabile è documentata da Microsoft a questo indirizzo.
Ad esempio, usando il comando Get-Process | Where-Object WorkingSet -GT (200000*1024)
è possibile ottenere istantaneamente l’elenco dei processi in esecuzione che occupano in memoria più di 200 MB (vedere anche Hard disk e SSD, le dimensioni non coincidono con quelle dichiarate dal produttore).