PowerShell non è "un CMD più moderno": è una shell e un linguaggio di scripting costruiti attorno a un'idea diversa da qualunque altro terminale — invece di passare testo da un comando all'altro, passa oggetti .NET veri e propri, con proprietà e metodi. Questa differenza cambia il modo in cui si scrivono anche le automazioni più semplici, ed è il motivo per cui vale la pena impararlo bene anziché trattarlo come un CMD travestito.
La convenzione Verbo-Nome dei cmdlet
Ogni comando PowerShell (chiamato cmdlet) segue lo schema Verbo-Nome: il verbo indica l'azione, il nome l'oggetto su cui agisce. Una volta interiorizzato lo schema, si intuiscono comandi mai visti prima.
| Cmdlet | Cosa fa | Alias comune |
|---|---|---|
Get-ChildItem | Elenca file/cartelle | ls, dir |
Set-Location | Cambia directory | cd |
Get-Content | Legge il contenuto di un file | cat, type |
Get-Process | Elenca i processi attivi | ps |
Get-Service | Elenca i servizi Windows e il loro stato | — |
Get-Help | Mostra la documentazione di un cmdlet | help, man |
Get-Command | Cerca cmdlet disponibili per nome o verbo | — |
Gli alias (ls, cat, ps...) esistono per abitudine di chi arriva da altre shell, ma dietro le quinte eseguono sempre il vero cmdlet PowerShell — con tutto il suo comportamento a oggetti, non quello del comando Unix o CMD che il nome suggerisce.
La pipeline: oggetti, non testo
Il simbolo | collega comandi come in ogni shell Unix, ma in PowerShell passa oggetti completi da un cmdlet all'altro. Questo permette di filtrare e ordinare per proprietà reali, non per posizione del testo su una riga:
Get-Process | Where-Object { $_.CPU -gt 50 } | Sort-Object CPU -Descending | Select-Object -First 5
Questa riga prende tutti i processi, tiene solo quelli che usano più di 50 secondi di CPU, li ordina dal più pesante e ne mostra i primi 5 — senza bisogno di awk, sort e head incatenati come si farebbe in una shell Unix testuale.
Variabili e tipi
Le variabili iniziano sempre con $ e non richiedono una dichiarazione di tipo esplicita (tipizzazione dinamica, ma comunque fortemente tipizzata a runtime):
$nome = "EGSOFT"
$numero = 42
$lista = @("uno", "due", "tre")
$oggetto = Get-Process -Name "notepad"
Write-Host "Il PID di $nome e' $($oggetto.Id)"
$_ è una variabile speciale che, dentro un blocco Where-Object o ForEach-Object, rappresenta l'oggetto corrente della pipeline — si incontra in praticamente ogni script PowerShell reale.
Script, moduli e profilo
- Uno script PowerShell è un file
.ps1: si esegue con.\script.ps1(il.\iniziale è obbligatorio per sicurezza, a differenza di un eseguibile qualsiasi) Import-Module NomeModulocarica funzionalità aggiuntive (es.ActiveDirectory,Azper Azure,SqlServer)$PROFILEcontiene il percorso dello script che PowerShell esegue automaticamente all'avvio di ogni sessione — il posto giusto per alias personalizzati e funzioni ricorrenti
Execution Policy: perché uno script "non parte"
Per impostazione predefinita, Windows blocca l'esecuzione di script .ps1 non firmati, per evitare che un malware distribuito come script PowerShell venga eseguito con un doppio click. Il comando Get-ExecutionPolicy mostra il criterio attivo; Set-ExecutionPolicy RemoteSigned -Scope CurrentUser (da eseguire come amministratore) è l'impostazione più comune in ambito sviluppo: permette gli script scritti localmente, richiede una firma digitale per quelli scaricati da internet.
Dove approfondire
La documentazione ufficiale e sempre aggiornata di ogni cmdlet — inclusi tutti i parametri ed esempi d'uso — è su Microsoft Learn - PowerShell, consultabile anche offline da terminale con Get-Help NomeCmdlet -Online o -Full per la versione completa senza uscire dalla shell.