Zurück zu PowerShell
Scripting Fortgeschritten

PowerShell Scripting

Variablen, Schleifen, Funktionen und Fehlerbehandlung — Skripte schreiben wie ein Profi.

Variablen und Datentypen

# Variablen beginnen mit $
$name = "Server01"
$anzahl = 42
$aktiv = $true

# Arrays
$server = @("DC01", "DC02", "FS01")
$server[0]  # "DC01"

# Hashtables (Schluessel-Wert-Paare)
$config = @{
    Host = "192.168.1.1"
    Port = 443
    SSL  = $true
}

Kontrollstrukturen

# If / ElseIf / Else
$freierPlatz = (Get-PSDrive C).Free / 1GB
if ($freierPlatz -lt 5) {
    Write-Warning "Weniger als 5 GB frei!"
} elseif ($freierPlatz -lt 20) {
    Write-Host "Platz wird knapp: $([math]::Round($freierPlatz,1)) GB"
} else {
    Write-Host "Genug Platz: $([math]::Round($freierPlatz,1)) GB"
}

# Switch
$tag = (Get-Date).DayOfWeek
switch ($tag) {
    "Monday"    { "Wochenstart - Backup pruefen" }
    "Friday"    { "Wochenende - Logs archivieren" }
    default     { "Normaler Tag" }
}

# ForEach-Schleife
$dienste = @("Spooler", "W32Time", "WinRM")
foreach ($dienst in $dienste) {
    Get-Service -Name $dienst | Select-Object Name, Status
}

# For-Schleife
for ($i = 1; $i -le 5; $i++) {
    Write-Host "Durchlauf $i"
}

Funktionen mit Parametern

function Get-DiskReport {
    param(
        [string]$ComputerName = $env:COMPUTERNAME,
        [int]$WarningSchwelle = 10
    )
    $laufwerke = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3"
    foreach ($lw in $laufwerke) {
        $freiGB = [math]::Round($lw.FreeSpace / 1GB, 1)
        $status = if ($freiGB -lt $WarningSchwelle) { "WARNUNG" } else { "OK" }
        [PSCustomObject]@{
            Laufwerk = $lw.DeviceID
            FreiGB   = $freiGB
            Status   = $status
        }
    }
}
Get-DiskReport -WarningSchwelle 20

Fehlerbehandlung: Try/Catch/Finally

try {
    $inhalt = Get-Content "C:\wichtig\config.txt" -ErrorAction Stop
    Write-Host "Datei gelesen: $($inhalt.Count) Zeilen"
} catch [System.IO.FileNotFoundException] {
    Write-Warning "Datei nicht gefunden!"
} catch {
    Write-Error "Unbekannter Fehler: $_"
} finally {
    Write-Host "Vorgang abgeschlossen."
}

Praxis: Einfaches Backup-Skript

$quelle = "C:\Projekte"
$ziel = "D:\Backup\Projekte_$(Get-Date -Format 'yyyy-MM-dd')"

if (!(Test-Path $ziel)) { New-Item $ziel -ItemType Directory | Out-Null }
Copy-Item "$quelle\*" $ziel -Recurse -Force
Write-Host "Backup nach $ziel abgeschlossen." -ForegroundColor Green

Tipp: Speichere Skripte als .ps1-Datei. Starte mit .\MeinSkript.ps1 oder Rechtsklick → "Mit PowerShell ausführen".