--- id: P1 titel: PowerShell – Befehle, Pipeline und Objekte block: programmierung woche: 7 worum: PowerShell reicht keine Texte weiter, sondern Objekte mit Eigenschaften. Wer das verstanden hat, braucht kein Textschnipseln mehr. rahmenplan: [A10, B3] lernfeld: LF5 merksatz: Verb-Substantiv finden, Get-Member fragen, filtern, sortieren, auswählen – formatiert wird erst ganz am Ende. karten: - frage: Wie sind die Befehle (Cmdlets) in PowerShell benannt, und wie findet man einen unbekannten Befehl? antwort: Nach dem Muster Verb-Substantiv, etwa Get-Service oder Stop-Process. Get-Command mit einem Suchbegriff findet Befehle, Get-Help erklärt sie mit Beispielen. - frage: Was unterscheidet die Pipeline in PowerShell von der in einer klassischen Linux-Shell? antwort: In PowerShell wandern Objekte mit Eigenschaften durch die Pipeline, nicht Textzeilen. Man filtert nach Eigenschaften wie Status oder Name, statt Spalten aus Text herauszuschneiden. - frage: Wozu dient Get-Member? antwort: Es zeigt, welche Eigenschaften und Methoden die Objekte haben, die ein Befehl liefert – also womit man in der Pipeline weiterarbeiten kann. --- ## Das Wesentliche - **Verb-Substantiv:** `Get-Service`, `Get-Process`, `Get-ChildItem`, `Stop-Service`. Die Verben sind festgelegt – `Get` liest, `Set` ändert, `New` legt an, `Remove` löscht. - **Selbst finden statt googeln:** `Get-Command *service*` findet Befehle, `Get-Help Get-Service -Examples` zeigt Beispiele. Einmal `Update-Help` als Administrator. - **Objekte statt Text.** `Get-Service` liefert Dienstobjekte mit Eigenschaften wie `Name`, `Status` und `StartType`. Welche es gibt, verrät `Get-Service | Get-Member`. - **Die vier Werkzeuge der Pipeline:** - `Where-Object` filtert: `Where-Object Status -eq 'Stopped'` - `Sort-Object` sortiert: `Sort-Object Name` - `Select-Object` wählt Eigenschaften oder Anzahl: `Select-Object Name, Status -First 10` - `ForEach-Object` tut etwas mit jedem Objekt - **Vergleiche** heißen `-eq`, `-ne`, `-gt`, `-lt`, `-like` (mit `*` als Platzhalter) und `-match` (regulärer Ausdruck). Groß- und Kleinschreibung spielt dabei keine Rolle. - **Ausgeben und weitergeben:** `Export-Csv` schreibt eine Tabelle für Excel, `Out-File` eine Textdatei. `Format-Table` gehört nur ans Ende – danach sind es keine verwertbaren Objekte mehr. - **Erst lesen, dann ändern.** Jeder Befehl, der etwas verändert, kennt `-WhatIf`: Er sagt, was er tun würde, und tut es nicht. ## Übersicht ```powershell # Alle beendeten Dienste, die automatisch starten sollten Get-Service | Where-Object { $_.Status -eq 'Stopped' -and $_.StartType -eq 'Automatic' } | Sort-Object Name | Select-Object Name, DisplayName # Die fünf Prozesse mit dem höchsten Speicherverbrauch Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 Name, Id, WorkingSet # Dateien im Downloadordner, älter als 90 Tage, als Tabelle für Excel Get-ChildItem $HOME\Downloads -File | Where-Object LastWriteTime -lt (Get-Date).AddDays(-90) | Select-Object Name, Length, LastWriteTime | Export-Csv alte-downloads.csv -NoTypeInformation -Encoding UTF8 ``` `$_` steht innerhalb der geschweiften Klammern für das Objekt, das gerade durch die Pipeline kommt. ## Prüfungsfrage **Frage:** Schreiben Sie eine PowerShell-Befehlszeile, die alle laufenden Dienste alphabetisch sortiert mit Name und Anzeigename in die Datei `dienste.csv` schreibt, und erklären Sie jeden Teil. **Antwort:** `Get-Service | Where-Object Status -eq 'Running' | Sort-Object Name | Select-Object Name, DisplayName | Export-Csv dienste.csv -NoTypeInformation` – `Get-Service` liefert alle Dienste als Objekte. `Where-Object` lässt nur die durch, deren Eigenschaft `Status` den Wert `Running` hat. `Sort-Object Name` sortiert nach dem Namen. `Select-Object` behält nur die beiden gewünschten Eigenschaften. `Export-Csv` schreibt das Ergebnis als Tabelle; `-NoTypeInformation` unterdrückt die Typzeile, die ältere PowerShell-Fassungen sonst an den Anfang setzen.