Variabili, cicli e funzioni
Le basi della programmazione in PowerShell.
Variabili
$nome = "Michele"
$eta = 30
$attivo = $true
$data = Get-Date
$nome
"Ciao $nome"
"Il prossimo anno avrai $($eta + 1) anni"
Remove-Variable nome
Get-Variable
Tipi espliciti:
[int]$n = 5
[string]$s = "testo"
[datetime]$d = "2026-10-24"
[bool]$b = $false
$() dentro una stringa valuta un'espressione o una proprietà.
Virgolette doppie espandono le variabili, apici singoli no:
"Ciao $nome"
'Ciao $nome'
Variabili automatiche
| Variabile | Contenuto |
|---|---|
$_ / $PSItem | Oggetto corrente nella pipeline |
$? | $true se l'ultimo comando è riuscito |
$LASTEXITCODE | Codice di uscita dell'ultimo programma esterno |
$null | Valore nullo |
$PWD | Cartella corrente |
$HOME | Cartella home |
$PID | PID della sessione |
$args | Argomenti non dichiarati |
$Error | Elenco degli errori |
$PSScriptRoot | Cartella dello script |
$env:NOME | Variabile d'ambiente ($env:USERNAME, $env:PATH) |
Array e hashtable
$colori = "rosso", "verde", "blu"
$colori[0]
$colori[-1]
$colori.Count
$colori += "giallo"
1..10
$colori -contains "verde"
$persona = @{ Nome = "Michele"; Ruolo = "Sysadmin" }
$persona.Nome
$persona["Ruolo"]
$persona.Eta = 30
$persona.Keys
$persona.Remove("Eta")
$oggetto = [pscustomobject]@{ Nome = "Michele"; Ruolo = "Sysadmin" }
Le hashtable non sono ordinate; per l'ordine usa [ordered]@{ ... }.
Condizioni
if ($eta -ge 18) {
"Maggiorenne"
} elseif ($eta -ge 14) {
"Adolescente"
} else {
"Minorenne"
}
switch ($giorno) {
"lun" { "Inizio settimana" }
"ven" { "Quasi weekend" }
default { "Giorno normale" }
}
Operatori: -eq -ne -gt -ge -lt -le -like -match -in -contains -and -or -not.
Cicli
foreach ($c in $colori) { $c }
for ($i = 0; $i -lt 5; $i++) { $i }
while ($i -lt 10) { $i++ }
do { $i-- } while ($i -gt 0)
1..5 | ForEach-Object { $_ * 2 }
break
continue
Funzioni
function Saluta {
param(
[Parameter(Mandatory)]
[string]$Nome,
[int]$Volte = 1
)
1..$Volte | ForEach-Object { "Ciao $Nome" }
}
Saluta -Nome "Michele" -Volte 2
Con convalida e aiuto:
function Test-Porta {
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline)]
[string[]]$Computer,
[ValidateRange(1,65535)]
[int]$Porta = 443
)
process {
foreach ($c in $Computer) {
[pscustomobject]@{
Computer = $c
Porta = $Porta
Aperta = (Test-NetConnection $c -Port $Porta -WarningAction SilentlyContinue).TcpTestSucceeded
}
}
}
}
"server1","server2" | Test-Porta -Porta 22
Una funzione restituisce tutto ciò che viene emesso, non solo il valore dopo return: attenzione a output indesiderati (si scartano con | Out-Null o $null = ...).
Gestione degli errori
try {
Get-Content .\inesistente.txt -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] {
"File non trovato"
} catch {
"Errore: $($_.Exception.Message)"
} finally {
"Sempre eseguito"
}
-ErrorAction Stop trasforma gli errori non terminanti in eccezioni, altrimenti catch non scatta.
$ErrorActionPreference = "Stop"
Stringhe
"Michele".ToUpper()
"a,b,c" -split ","
"a","b","c" -join ";"
"vecchio testo" -replace "vecchio","nuovo"
"abc".Substring(1,2)
" spazi ".Trim()
"{0} ha {1} anni" -f "Michele", 30
"testo".Contains("es")
"dato" -like "da*"
Here-string
$testo = @"
Riga 1 con $nome
Riga 2
"@
$letterale = @'
Qui $nome non viene espanso
'@
Date
Get-Date
Get-Date -Format "yyyy-MM-dd HH:mm"
(Get-Date).AddDays(-7)
(Get-Date) - (Get-Date "2026-01-01")
New-TimeSpan -Start (Get-Date "2026-01-01") -End (Get-Date)