Wiki di Michele

Variabili, cicli e funzioni

GuidaUltima modifica: 24/10/2026 Verificata il 24/10/2026

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

VariabileContenuto
$_ / $PSItemOggetto corrente nella pipeline
$?$true se l'ultimo comando è riuscito
$LASTEXITCODECodice di uscita dell'ultimo programma esterno
$nullValore nullo
$PWDCartella corrente
$HOMECartella home
$PIDPID della sessione
$argsArgomenti non dichiarati
$ErrorElenco degli errori
$PSScriptRootCartella dello script
$env:NOMEVariabile 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)

Tag

comandipowershellwindows

Altre pubblicazioni in questa sezione

Suggerisci una correzione