--- id: P2 titel: Variablen, Bedingungen und Schleifen block: programmierung woche: 7 worum: Drei Bausteine reichen für fast jedes Verwaltungsskript – sich etwas merken, eine Entscheidung treffen, etwas wiederholen. rahmenplan: [A10, A4] lernfeld: LF5 merksatz: Merken mit $, entscheiden mit if, wiederholen mit foreach. Der Rest ist Übung. karten: - frage: Was ist der Unterschied zwischen "Hallo $name" und 'Hallo $name' in PowerShell? antwort: In doppelten Anführungszeichen wird die Variable durch ihren Wert ersetzt, also etwa „Hallo Anna". In einfachen Anführungszeichen bleibt der Text genau so stehen, wie er geschrieben ist. - frage: Was gibt dieses Skript aus – $summe = 0; foreach ($z in 1..5) { if ($z % 2 -eq 0) { $summe += $z } }; $summe antwort: 6. Die Schleife läuft über 1 bis 5, die Bedingung lässt nur gerade Zahlen durch (Rest bei Division durch 2 ist 0), also werden 2 und 4 addiert. - frage: Wann nimmt man foreach als Schleife und wann ForEach-Object? antwort: foreach für eine Liste, die schon in einer Variablen liegt – übersichtlich und schnell. ForEach-Object mitten in einer Pipeline, wenn die Objekte direkt aus einem Befehl kommen. --- ## Das Wesentliche - **Variablen** beginnen mit `$`: `$pfad = 'D:\Daten'`. Sie können alles aufnehmen – Text, Zahlen, Listen, ganze Objekte aus einem Befehl: `$dienste = Get-Service`. - **Text:** In `"…"` werden Variablen eingesetzt, in `'…'` nicht. Für Eigenschaften im Text: `"Freier Platz: $($laufwerk.FreeSpace)"`. - **Listen** entstehen mit `@('PC-001', 'PC-002')` oder als Bereich `1..10`. Das erste Element ist `$liste[0]`, die Anzahl `$liste.Count`. - **Eigene Objekte** für Berichte: `[PSCustomObject]@{ Name = $n; Status = $s }`. Daraus wird mit `Export-Csv` eine saubere Tabelle. - **Bedingungen:** `if (…) { … } elseif (…) { … } else { … }`. In der Klammer steht ein Vergleich mit `-eq`, `-gt`, `-like` usw. – **nicht** mit `=`, das ist eine Zuweisung. - **Verknüpfen** mit `-and`, `-or`, `-not`. - **Schleifen:** `foreach ($pc in $rechner) { … }` geht jedes Element durch. `while (…) { … }` läuft, solange die Bedingung gilt – und braucht deshalb etwas, das sie irgendwann falsch werden lässt. - **Rechnen:** `+ - * /` und `%` für den Rest einer Division. `1GB` ist für PowerShell eine Zahl, `$bytes / 1GB` rechnet also direkt in Gigabyte um. ## Übersicht ```powershell $grenze = 15 # Prozent freier Platz, ab dem gewarnt wird $laufwerke = Get-CimInstance -ClassName Win32_LogicalDisk -Filter 'DriveType = 3' foreach ($lw in $laufwerke) { $frei = [math]::Round($lw.FreeSpace / $lw.Size * 100, 1) if ($frei -lt $grenze) { Write-Warning "$($lw.DeviceID) hat nur noch $frei % frei." } else { Write-Output "$($lw.DeviceID): $frei % frei – in Ordnung." } } ``` `DriveType = 3` sind lokale Festplatten; USB-Sticks (2) und Netzlaufwerke (4) bleiben außen vor. ## Prüfungsfrage **Frage:** Schreiben Sie ein kurzes PowerShell-Skript, das für eine Liste von drei Rechnernamen prüft, ob sie per Ping erreichbar sind, und für jeden Rechner „erreichbar" oder „nicht erreichbar" ausgibt. **Antwort:** ```powershell $rechner = @('PC-001', 'PC-002', 'PC-003') foreach ($pc in $rechner) { if (Test-Connection -ComputerName $pc -Count 1 -Quiet) { Write-Output "$pc erreichbar" } else { Write-Output "$pc nicht erreichbar" } } ``` Die Liste wird in einer Variablen gehalten, `foreach` geht jeden Namen durch. `Test-Connection -Quiet` liefert statt einer ausführlichen Ausgabe nur wahr oder falsch, was die `if`-Bedingung direkt auswertet.