PowerShell – Introduzione
In principio furono i File Batch.
Era il 1982 quando Microsoft introdusse MS-DOS che portava con sé questa “perla” di ambiente di scripting o meglio dei file di testo che contenevano sequenze di comandi che venivano eseguiti dall’interprete di comando dell’MS-DOS, cioè a seconda delle versioni command.com o cmd.exe. (NB: nel 1980 Microsoft lanciò XENIX che discendendo da UNIX 7 portava già con sé la Shell sh …magari l’avesse messa anche in MS-DOS 😉
Nel 1998 venne introdotto Windows Script Host (o WSH) che consentiva l’esecuzione di script in VBScript o JScript. Fu una meteora: luminosa e veloce!
Nel 2002 in Microsoft si inizia a parlare di Monad (cercate su Internet “Monad Manifesto“) che nel 2006 diventa Windows PowerShell (immaginatevi nel 2007 andare in Veneto a fare conferenze su Exchange Server 2007 e parlare di monad!)
Tornando seri, con PowerShell o Microsoft Shell o Windows PowerShell si intende sia il framework di automazione multipiattaforma sia il linguaggio di scripting di Microsoft basato su .NET, che dall’essere solo un sistema di scripting per Windows ed Exhange si è trasformato in uno strumento open-source multipiattaforma (Windows, MacOS, Linux e vari Cloud) basato su cmdlet, moduli, pipeline e output che realizza un sistema di automazione flessibile e potente.
Installare PowerShell
L’installazione di PowerShell cambia ovviamente a seconda del sistema operativo e della versione dello stesso
Microsoft
In ambiente Microsoft la strada più veloce è quella di passare dallo Store questa possibilità presenta due fondamentali vantaggi: aggiornamenti automatici integrati in Windows e possibilità di installarlo facilmente indipendentemente dalla famiglia di processori x86, x64 o Arm64.
In alternativa è possibile scaricare ed eseguire il pacchetto MSI adatto alla propria architettura. Questa scelta è particolarmente appezzata quando si usano sistemi di distribuzione centralizzata del software
MacOS
Anche qui abbiamo due scelte.
La prima è quella di scaricare direttamente il .pkg di installazione, quindi procede manualmente all’installazione. Attenzione: in questo secondo caso quasi di sicuro comparirà un messaggio che dice: powershell-7.x.x-osx-arm64.pkg” non è stato aperto Apple non ha potuto verificare “powershell-7.x.x-osx-arm64.pkg”. Se dovesse succedere basta autorizzare il pacchetto andando in Impostazioni di sistema -> Privacy e sicurezza -> Sicurezza, quindi individuare il pacchetto e selezionare apri comunque. Quindi rilanciare l’installazione e scegliere Apri Comunque.
La seconda è quella di passare da Homebrew. Dopo aver installato brew basta lanciare il comando: brew install –cask powershell
Linux
Qui dipende dalla Distro che si usa. Microsoft supporta direttamente l’installazione su Alpine Linux, Debian, Red Hat e Ubuntu. Per l’installazione su queste distribuzioni fare riferimento alla documentazione ufficiale di PowerShell. Sempre sul sito si trovano le indicazioni per altre distribuzioni supportate dalla community.
Verificare la versione installata
Indipendentemente dal Sistema Operativo, è possibile capire la versione di PowerShell installato con un semplice cmdlet: $PSVersionTable.PSVersion
Questo semplice cmdlet ci restituisce la release esatta di PowerShell che stiamo eseguendo.

Figura 1: Output del cmdlet PSVersion eseguita ad esempio su MacOS
PowerShell ISE e Visual Studio Code
Sui sistemi Microsoft, abbiamo anche la possibilità di usare PowerShell ISE (Integrated Scripting Environmen), un’interfaccia grafica per PowerShell che consente di scrivere, eseguire e testare script in un unico ambiente. Offre alcune funzionalità avanzate come IntelliSense, debug, e un’interfaccia divisa tra riquadro script e console.
Per tutti e tre i SO supportati (Windows MacOS e Linux,) possiamo anche utilizzare Visual Studio Code. Un IDE avanzato che ovviamente offre tutte le funzioni di PowerShell ISE e molto altro. Consiglio in suo uso se il progetto PowerShell è sostanzioso e “ne vale la pena” altrimenti PowerShell ISE è più che sufficiente.
Personalmente utilizzo Sublime Text con il Package per PowerShell in modo da avere le funzionalità equivalenti a IntelliSense con un editor che mi è familiare ed è presente in tutti gli ambienti. In alternativa uso Visual Studio Code configurato per funzionare come la ISE

Figura 2:VisualStudio Code configurato come PowerShell ISE
Let’s go
Una volta viste la storia e l’installazione di PowerShell nei diversi scenari, è ora di iniziare a giocare!
Il mattoncino base di PowerShell sono i cmdlet.
Un cmdlet è un comando di PowerShell con una funzione predefinita, simile a un operatore in un linguaggio di programmazione.
Alcuni aspetti fondamentali che bisogna conoscere sui cmdlet:
- Sono disponibili cmdlet di sistema, cmdlet utente ed è anche possibile creare cmdlet personalizzati in .Net.
- I cmdlet restituiscono i risultati come oggetto o come matrice di oggetti (ricordiamoci sempre che PowerShell nasce da .Net)
- I cmdlet non sono case sensitive (non fanno di distinzione tra maiuscole e minuscole), quindi, ad esempio, non importa se digitiamo Get-Process o get-process o GET-PROCESS.
- I cmdlet possono ricevere in input dati per l’analisi o trasferire in output dati a un altro cmdlet utilizzando la concatenazione per mezzo dell’operatore (|)
- Se si desidera utilizzare più cmdlet in una stringa, è necessario separarli con un punto e virgola (;).
Un cmdlet è sempre composto da un verbo (o da una parola che funziona come verbo) e da un sostantivo, separati da un trattino (questa sintassi si chiama verb-noun in pratica azione-oggetto)
I principali verbi sono:
- Get: ottenere qualcosa
- Set: definire qualcosa
- Start: eseguire qualcosa
- Stop: arrestare qualcosa in esecuzione
- Out: per mandare qualcosa in output
- New: per creare qualcosa
Alcune buone notizie:
- I cmdlet hanno un ottimo help in linea utilizzando la sintassi get-help cmdlet
- È possibile farsi aiutare nella scrittura di un cmdlet con il tasto TAB, ad esempio, invece che Get-NetAdapter possiamo semplicemente scrivere Get–NetA quindi premere TAB. PowerShell automaticamente ci proporrà uno per volta tutti i comandi che iniziano con Get-NetAdapter, Get-NetAdapterAdvancedProperty con CTRL+Z si torna indietro

Figura 3:esempio dl funzionamento di Get-Help
Le Variabili in PowerShell
Chiunque utilizzi PowerShell (a meno di non usarlo in modalità copiancolla di righe trovate su Internet) deve come prima cosa conoscere come utilizzare le variabili.
PowerShell identifica le variabili con il simbolo del dollaro ($). I nomi delle variabili non sono case-sensitive, quindi $Nome e $nome sono considerati la stessa cosa.
Ad esempio:
$nome = “Ciccio Pasticcio” assegna alla variabile $nome la stringa Ciccio Pasticcio
Mentre Write-Output $Nome o semplicemente $Nome restituisce il valore della variabile

Figura 4: IN e OUT e cancellazione di una variabile
PowerShell utilizza principalmente sette tipi di variabili:
String: Testo (per dichiarare una stringa basta racchiudere il testo tra virgolette)
Integer: Un numero intero
Double: Un numero che include la virgola
Boolean: Un valore $True o $False
DateTime: Data e ora
Array: Una struttura di dati che contiene una collezione di elementi dello stesso tipo o di tipi diversi. Gli elementi sono memorizzati in sequenza e possono essere accessibili tramite un indice
HashTable: Una struttura dati che comprende una collezione non ordinata di coppie chiave-valore. È come un dizionario in cui si utilizza una chiave univoca per memorizzare e recuperare ciascun valore. Questo rende le hashtable eccellenti per le ricerche e gli scenari in cui è necessario cercare facilmente i valori. Per creare una hashtable, si utilizza = @{}. All’interno delle parentesi graffe, si specifica ogni coppia come la chiave seguita da un segno di uguale (=) e poi il valore

Figura 5: valori Int e Double

Figura 6: Array

Figura 7: HashTable
Ambiti delle variabili
In PowerShell gli ambiti (o scope) definiscono la visibilità e la durata delle variabili, limitandone l’accesso per prevenire modifiche accidentali.
Esistono 4 scope principali:
- Global: Visibili all’interno della sessione (è il default)
- Local: Visibili esclusivamente all’interno della funzione.
- Script: Visibili esclusivamente all’interno dello script.

Figura 8: Scope delle variabili
Facciamo una prova:
- Apriamo una nuova finestra PowerShell e una finestra PowerShell ISE in modo da non avere altre variabili in memoria.
- In ISE creiamo un novo script che contiene una singola istruzione: Write $x e salviamo lo script come Scope.ps1
- Nella finestra non ISE eseguiamo lo script
- Non ci restituirà nulla: quando uno script viene eseguito viene creata una nuova sessione dove $x non è definito; quindi, PowerShell va a vedere se la variabile è definita come global (il contesto superiore e non la trova nemmeno li. Quindi PowerShell decide che la variabile è vuota e non stampa a video nulla.
- Nella finestra non ISE scrivere $x =1 e rieseguire lo script. Questa volta nello script la variabile continua a non essere definita, ma l’abbiamo assegnata a livello globale; quindi, PowerShell pur non trovandola nello script, salendo a livello globale la trova e la può stampare a video.
- Adesso in PowerShell ISE modificare lo script aggiungendo come prima riga $x=10 e salvarlo.
- Spostiamoci in PowerShell non ISE e rieseguiamo nuovamente lo script.
- Questa volta ci verrà stampato a video 10, poiché la variabile è definita nello script

Figura 9: Contesto delle variabili
Beh, per questa volta direi che vi ho stufato abbastanza.
Ci vediamo la prossima volta per parlare di file e cartelle!