PowerShell — Cheat Sheet

Tag: powershell, scripting, automation, windows, cli, sysadmin

Livello: intermedio

TL;DR: Shell orientata agli oggetti e linguaggio di scripting per automazione e gestione di sistema. Trasferisce oggetti .NET strutturati anziché testo grezzo lungo la pipeline.

Concetti chiave

Passaggio di oggetti .NET tipizzati nella pipeline anziché flussi di puro testo.

Nomenclatura comandi uniforme basata sullo schema approvato Verb-Noun (es. Get-Process).

I cmdlet sono classi compilate .NET o script nativi che implementano comandi specifici.

Pipeline streaming che processa gli elementi uno alla volta preservando memoria ed efficienza.

Variabile speciale $_ o $PSItem per accedere all'oggetto corrente nella pipeline.

Provider PowerShell espongono archivi dati (FileSystem, Registry, Cert) come unita' logiche navigate con comandi standard.

Gestione errori separata tra terminating error e non-terminating error tramite parametro -ErrorAction.

Blocco try/catch/finally cattura esclusivamente i terminating error.

ScriptBlock { ... } come unita' eseguibile di codice anonimo riutilizzabile e parametrizzabile.

Domande tipiche e risposte pronte

Q: Qual e' la differenza chiave tra la pipeline di PowerShell e quella di Bash?R: Bash trasmette flussi di byte e stringhe di testo, richiedendo parsing con grep, awk o sed. PowerShell trasmette oggetti .NET ricchi di proprieta' e metodi, consentendo filtraggi e manipolazioni dirette sugli attributi senza alcun parsing.

Q: Come si gestisce un errore non bloccante con try/catch in PowerShell?R: I comandi PowerShell generano spesso errori non-terminating che scavalcano il blocco catch. Per intercettarli imposto -ErrorAction Stop sul cmdlet o valorizzo $ErrorActionPreference = 'Stop'.

Q: A cosa serve e come funziona la Execution Policy?R: E' una misura di sicurezza di base contro l'esecuzione accidentale di script, non una barriera di sicurezza. Determina se e come eseguire script locali o scaricati (es. Restricted, RemoteSigned, Unrestricted, Bypass).

Q: Quando si usano Where-Object e ForEach-Object rispetto al filtraggio anticipato?R: Seguo la regola "filter left, format right". Se il cmdlet di origine dispone di parametri di filtro specifici, uso quelli per evitare di caricare oggetti inutili nella pipeline; uso Where-Object solo a valle.

Insidie e errori comuni

Il valore booleano $true o un array non vuoto valutati in stringhe senza sub-expression $($obj.Prop) producono output errato.

L'operatore di confronto per l'uguaglianza e' -eq e non == (che genera errore di parsing).

I comandi nativi Windows/Linux (es. ping.exe, git) scrivono nello stream stderr senza causare automaticamente un terminating error in PowerShell.

Format-Table o Format-List trasformano gli oggetti di business in oggetti di formattazione grafica, rompendo la pipeline successiva.

L'uso di += su array ricrea ogni volta un nuovo array in memoria; per collezioni massive conviene usare [System.Collections.Generic.List[T]].

Dimenticare che PowerShell non e' case-sensitive per nomi di variabili o cmdlet, ma puo' esserlo sui dati trattati da specifici metodi .NET.

Snippet e comandi

# Ispezione membri, metodi e proprieta' di un oggetto
Get-Process | Get-Member

# Filtraggio e proiezione tramite pipeline
Get-Service | Where-Object Status -eq 'Running' | Select-Object Name, DisplayName, StartType

# Gestione terminating error con blocco try/catch
try {
    Get-Item -Path 'C:\file_inesistente.txt' -ErrorAction Stop
}
catch [System.IO.FileNotFoundException] {
    Write-Warning "File non trovato: $($_.Exception.Message)"
}
catch {
    Write-Error "Errore generico: $($_.Exception.Message)"
}

# Creazione di oggetti personalizzati
[PSCustomObject]@{
    Id        = 101
    Status    = 'Active'
    Timestamp = (Get-Date)
}

# Lettura e parsing rapido di JSON
$config = Get-Content -Path './config.json' -Raw | ConvertFrom-Json
$config.database.connectionString

# Esecuzione remota su nodo target
Invoke-Command -ComputerName 'srv-app-01' -ScriptBlock { Get-Service -Name 'W3SVC' }

Da ripassare

[ ] Parametri avanzati e attributo [CmdletBinding()] con supporto a ShouldProcess e -WhatIf

[ ] Gestione degli stream di output (1: Success, 2: Error, 3: Warning, 4: Verbose, 5: Debug, 6: Information)

[ ] Differenze architetturali e compatibilita' tra Windows PowerShell 5.1 e PowerShell 7+ (Core)

[ ] Utilizzo di PSCredential e moduli di gestione segreti (Microsoft.PowerShell.SecretManagement)

[ ] Tecniche di parallelismo con ForEach-Object -Parallel e ThreadJob

Jarvis Interviews
Jarvis