PowerShell è una shell a riga di comando, disponibile per Windows, Linux e macOS, che ricorda molto il prompt dei comandi di una volta (e di cui può utilizzare tutti i comandi), e si serve di un linguaggio di scripting sviluppato da Microsoft. Si basa sul .NET Framework e fornisce varie funzionalità di base, o ampliabili tramite gli script condivisi dagli utenti della gallery, attraverso i suoi comandi, chiamati cmdlet, pronunciato command-let. PowerShell si rivolge principalmente agli amministratori di rete o di computer, perché permette di raccogliere e automatizzare molte operazioni, avviabili anche da remoto, per gestire gruppi di computer e di utenze in un domino aziendale.
Cosa è possibile fare con PowerShell?
Conoscendo i comandi giusti (e questa è la parte più difficile per i principianti) potenzialmente di tutto, installazione di programmi e aggiornamenti di Windows, modifiche al registro di configurazione, creazione/cancellazione di file e cartelle, se cercate nella Gallery ci trovate moltissimi script, già pronti all’uso e senza bisogno di conoscere i cmdlet.
La presente guida è scritta da un principiante nel mondo di PowerShell, quindi ci potrebbero essere degli errori o delle imprecisioni, non ci troverete chissà quali segreti, ma vorrei chiarire, anche a me stesso, alcuni concetti di base per cominciare a muoversi in questo ambiente.
Gli script
Uno script in Powershell è un file, creabile e modificabile con Notepad o un qualsiasi editor di testo, con estensione .ps1. Quindi se decidete di usare Notepad ricordatevi di salvare il file, o rinominarlo, con l’estensione .ps1.
Cosa può contenere lo script? Anche una semplice riga di comando che visualizza un saluto a video.
Oppure si può resettare il Windows Update, quando si blocca, utilizzando un mix di comandi DOS e di cmdlet di PowerShell.
Windows PowerShell vs PowerShell
Di base, Windows 10 e Windows 11, hanno installato la versione 5.1 di Windows PowerShell.
PowerShell è disponibile su Github, quindi è Open Source, non è un aggiornamento di Windows PowerShell 5.1, ma può coesistere nello stesso sistema operativo.
Attualmente siamo arrivati alla versione 7.3.6 e per installarla potete seguire le istruzioni presenti in questa pagina.
Windows PowerShell ISE, il cui aspetto lo vedete nella foto all’inizio dell’articolo, vi offre una GUI da cui poter lanciare gli script, testarne il funzionamento e modificare gli eventuali errori. PowerShell 7 invece è solo da riga di comando.
Get-help
Uno dei primi comandi utili per imparare come utilizzare gli altri cmdlet è get-help
, seguito dal nome dell’altro cmdlet.
Con questo comando get-help get-service -detailed
otteniamo informazioni dettagliate (ma non sempre comprensibili) sul cmdlet get-service.
Molto meglio andare online, con questo comando get-help get-service -online
, per avere maggiori informazioni ed esempi su tutti i cmdlet.
La guida di PowerShell è aggiornabile all’ultima versione con il comando Update-Help
, però tra errori, file di help che non esistono e una chiarezza della guida non sempre impeccabile, alla fine la guida non è che mi sia poi tanto utile (almeno a me).
Alla fine preferisco fare una ricerca su internet del cmdlet per vedere tutti gli esempi e i modi in cui utilizzarlo.
Abilitare gli script
Una delle prime cose da fare, se volete utilizzare uno script, è quello di abilitarne l’avvio che di solito è bloccato, vedi articolo su come farlo.
I cmdlet
Il commando Get-Help -Category cmdlet
mostra i cmdlet presenti in PowerShell.
Mentre Get-Alias
, visualizza gli Alias del comando, una sorta di versione abbreviata dello stesso.
Così start-process notepad
e start notepad
sono due comandi equivalenti con cui aprire Notepad, mentre stop-process -name notepad
e spps -name notepad
servono per terminare Notepad. Con -confirm
si può aggiungere una conferma prima di chiudere il programma.
I comandi
Penso che neanche il miglior esperto di PowerShell di PowerShell si possa ricordare tutti i comandi e la loro sintassi completa. Se volete sapere quanti ne ha la vostra versione di PowerShell digitate pure questo comando (get-command).count
Quindi Get-Command -Name *service*
serve per filtrare tutti I cmdlet, e gli applicativi, che hanno la parola service nel nome, mentre Get-Command -Name *service* -CommandType Cmdlet, Function, Alias
visualizza solo i cmdlet.
Esecuzione dello script
Per avviare uno script bisogna cliccare con il tasto destro del mouse sopra l’icona del file .ps1 e scegliere “Esegui con PowerShell
”.
Nella maggior parte dei casi questo tipo di esecuzione dello script impedisce di vedere il risultato finale, perché la schermata si chiude subito, basta aggiungere allo script una riga finale come questa Read-Host -Prompt "Premete Invio per uscire"
che ferma l’esecuzione dello script e gli impedisce di chiudersi sino a quando non premete Invio.
Altrimenti lo si può eseguire dalla schermata di PowerShell indicando il percorso completo dove si trova il file .ps1, oppure se lo avviamo dalla stessa cartella dove si trova il file dobbiamo aggiungere un .\
prima del suo nome.
Reindirizzare l’output
Per alcuni comandi, per esempio get-process, può essere utile avere l’elenco di tutti i processi attivi salvato in un file di testo per poterlo consultare in seguito.
Si aggiunge così al comando l’opzione | out-file d:\nomefile.txt e il comando completo diventa get-process | out-file d:\ListaProcessi.txt
. Invece di vedere il risultato del comando a video, lo troverete nel file d:\ListaProcessi.txt.
Anche le opzioni | format-list
e | format-table
permettono di avere un output dall’aspetto ben diverso che può essere reindirizzato su un file aggiungendo alla fine del comando > nomefile.csv, il tutto diventerebbe get-date | format-list > d:\data.csv
Il simbolo #
Se vi lanciate nella scrittura di qualche script, ricordatevi del simbolo # che, messo all’inizio di una riga, permette di commentare quanto state facendo, inserire delle note nello script è importante per quando dovrete tornare a metterci mano o quando lo script verrà aperto da qualche altra persona.
Convenzioni
Per non doverle rispiegare ogni volta, riassumo qui alcune regole da usare nei comandi:
Le virgolette, per contenere il percorso di una cartella, vanno sempre usate quando è presente uno spazio nel nome come “D:\Articoli da fare”, non è indispensabile farlo quando il nome non ha spazi come D:\TurboLab. Per nostra scelta, o abitudine, possiamo usarle sempre, alla fine non cambia niente.
Le opzioni da aggiungere al cmdlet:
-verbose
serve a mostrare a video cosa ha fatto il comando.-force
serve a sovrascrivere, senza richiesta, eventuali file già presenti nella cartella destinazione che hanno lo stesso nome. Con -force possiamo anche cancellare file nascosti o in sola lettura.-recurse
permettere di copiare tutto il contenuto della cartella.-confirm
ferma l’esecuzione dello script sino a quando l’utente non conferma di poter procedere.
Il carattere jolly * permette di copiare tutti i file che hanno un nome qualsiasi e estensione .zip (per esempio), quindi *.zip.
Conclusioni
Per il momento mi fermerei qui con questo articolo, ci sono cose come le variabili o i cicli di PowerShell che sono per me ancora sconosciute.
Se mi sono dimenticato di qualche cosa di basilare da inserire i commenti sono a vostra disposizione per segnalarmelo.
Intanto vi ricordo gli articoli su PowerShell che avevo scritto in precedenza. Una pagina Microsoft con tutti i cmdlet di base e le varie opzioni. La Gallery dove trovare script già pronti e le istruzioni per installarli. E il sito della community di PowerShell dove trovare altri esempi.