terminal Windows

PowerShell da zero: la sintassi e i comandi principali

calendar_today personTeam EGSOFT schedule3 min di lettura

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.

CmdletCosa faAlias comune
Get-ChildItemElenca file/cartellels, dir
Set-LocationCambia directorycd
Get-ContentLegge il contenuto di un filecat, type
Get-ProcessElenca i processi attivips
Get-ServiceElenca i servizi Windows e il loro stato
Get-HelpMostra la documentazione di un cmdlethelp, man
Get-CommandCerca 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 NomeModulo carica funzionalità aggiuntive (es. ActiveDirectory, Az per Azure, SqlServer)
  • $PROFILE contiene 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.

terminalAltri articoli su Windows grid_viewTutti gli articoli
Scrivici su WhatsApp