# PowerShell – Parameter

**Grundidee**

Parameter sind Zusatzangaben zu einem PowerShell-Befehl.

Mit Parametern legt man fest, **was genau ein Cmdlet tun soll** oder **wie es arbeiten soll**.

Ein PowerShell-Befehl besteht meistens aus:

| Bestandteil | Bedeutung |
|---|---|
| Cmdlet | Der eigentliche PowerShell-Befehl |
| Parameter | Zusatzangabe, die das Cmdlet genauer steuert |
| Parameterwert | Der konkrete Wert, der an den Parameter übergeben wird |

Beispiel:

    Get-Process -Name "notepad"

Bedeutung:

| Teil | Erklärung |
|---|---|
| Get-Process | Cmdlet |
| -Name | Parameter |
| "notepad" | Parameterwert |

PowerShell zeigt dadurch nicht alle Prozesse an, sondern nur den Prozess mit dem Namen **notepad**.

---

**Merksatz**

**Cmdlet = Was soll passieren?**  
**Parameter = Wie genau soll es passieren?**  
**Parameterwert = Womit oder worauf soll es passieren?**

---

**Typischer Aufbau**

Ein PowerShell-Befehl mit Parameter hat meistens diesen Aufbau:

    Cmdlet -Parameter Wert

Beispiel:

    Get-Service -Name "Spooler"

Bedeutung:

| Teil | Erklärung |
|---|---|
| Get-Service | Dienste anzeigen |
| -Name | Nach einem bestimmten Dienstnamen suchen |
| "Spooler" | Druckwarteschlange als konkreter Dienst |

---

**Warum Parameter wichtig sind**

Ohne Parameter führt ein Cmdlet oft eine allgemeine Aktion aus.

Beispiel:

    Get-Service

Dieser Befehl zeigt viele Dienste an.

Mit Parameter wird die Ausgabe gezielter:

    Get-Service -Name "Spooler"

Jetzt wird nur der Dienst **Spooler** angezeigt.

Parameter helfen also dabei, Befehle genauer, sicherer und gezielter auszuführen.

---

**Parameter mit Wert**

Viele Parameter benötigen einen Wert.

Beispiel:

    Get-ChildItem -Path "C:\Temp"

Hier braucht der Parameter **-Path** einen konkreten Pfad.

Weitere Beispiele:

    Get-Process -Name "notepad"

    Get-Service -Name "Spooler"

    Get-ChildItem -Filter "*.txt"

Typische Parameter mit Wert:

| Parameter | Bedeutung |
|---|---|
| -Name | Name eines Objekts |
| -Path | Pfad zu Datei oder Ordner |
| -Filter | Filter für Dateien oder Objekte |
| -ComputerName | Zielcomputer |
| -Credential | Zugangsdaten |
| -Destination | Zielpfad |
| -Source | Quellpfad |

---

**Schalterparameter**

Ein Schalterparameter braucht keinen eigenen Wert.

Er ist aktiv, sobald man ihn angibt.

Beispiel:

    Get-ChildItem -Recurse

Der Parameter **-Recurse** bedeutet, dass auch Unterordner durchsucht werden.

Weitere Beispiele:

    Remove-Item "C:\Temp\test.txt" -Force

    Get-ChildItem -Hidden

    Stop-Process -Name "notepad" -Force

Typische Schalterparameter:

| Parameter | Bedeutung |
|---|---|
| -Recurse | Unterordner einbeziehen |
| -Force | Aktion erzwingen |
| -Hidden | Versteckte Elemente anzeigen |
| -WhatIf | Zeigt, was passieren würde, ohne es auszuführen |
| -Confirm | Fragt vor der Ausführung nach Bestätigung |

---

**Wichtige Sicherheitsparameter**

Besonders wichtig sind **-WhatIf** und **-Confirm**.

Diese Parameter helfen, gefährliche Aktionen zu prüfen.

Beispiel:

    Remove-Item "C:\Temp\test.txt" -WhatIf

PowerShell zeigt nur an, was gelöscht werden würde.  
Die Datei wird nicht wirklich gelöscht.

Beispiel mit Bestätigung:

    Remove-Item "C:\Temp\test.txt" -Confirm

PowerShell fragt vor dem Löschen nach.

Das ist besonders wichtig bei Befehlen wie:

| Cmdlet | Risiko |
|---|---|
| Remove-Item | Dateien oder Ordner löschen |
| Stop-Process | Prozesse beenden |
| Restart-Computer | Computer neu starten |
| Set-Item | Werte ändern |
| New-Item | Neue Dateien, Ordner oder Einträge erstellen |

---

**Positionelle Parameter**

Manche Parameter müssen nicht ausgeschrieben werden, weil PowerShell anhand der Position erkennt, welcher Parameter gemeint ist.

Beispiel mit ausgeschriebenem Parameter:

    Get-ChildItem -Path "C:\Temp"

Kurzform:

    Get-ChildItem "C:\Temp"

PowerShell erkennt hier, dass **"C:\Temp"** der Wert für **-Path** ist.

Für die Prüfung und für saubere Dokumentation ist die ausgeschriebene Variante besser:

    Get-ChildItem -Path "C:\Temp"

Sie ist klarer und leichter nachvollziehbar.

---

**Mehrere Parameter kombinieren**

Ein Cmdlet kann mehrere Parameter gleichzeitig verwenden.

Beispiel:

    Get-ChildItem -Path "C:\Temp" -Filter "*.txt" -Recurse

Bedeutung:

| Teil | Erklärung |
|---|---|
| Get-ChildItem | Ordnerinhalt anzeigen |
| -Path "C:\Temp" | Im Ordner C:\Temp suchen |
| -Filter "*.txt" | Nur Textdateien anzeigen |
| -Recurse | Auch Unterordner durchsuchen |

Der Befehl sucht also im Ordner **C:\Temp** und allen Unterordnern nach Dateien mit der Endung **.txt**.

---

**Parameter und Datentypen**

Parameter erwarten oft bestimmte Datentypen.

Beispiele:

| Datentyp | Beispiel | Bedeutung |
|---|---|---|
| String | "notepad" | Text |
| Integer | 10 | Ganze Zahl |
| Boolean | $true / $false | Wahr oder falsch |
| Array | "PC1","PC2","PC3" | Mehrere Werte |
| Credential | Benutzername/Kennwort | Zugangsdaten |
| Switch | -Force | Schalterparameter ohne Wert |

Beispiel mit mehreren Namen:

    Get-Service -Name "Spooler","WinRM"

Hier bekommt der Parameter **-Name** mehrere Werte.

---

**Parameter und Anführungszeichen**

Texte mit Leerzeichen sollten in Anführungszeichen geschrieben werden.

Beispiel:

    Get-ChildItem -Path "C:\Meine Dateien"

Ohne Anführungszeichen könnte PowerShell den Pfad falsch interpretieren.

Bei einfachen Werten ohne Leerzeichen sind Anführungszeichen oft nicht zwingend nötig:

    Get-Service -Name Spooler

Trotzdem ist es beim Lernen oft übersichtlicher, Zeichenketten mit Anführungszeichen zu schreiben.

---

**Parameter mit Wildcards**

Viele Parameter unterstützen Platzhalterzeichen.

Das wichtigste Platzhalterzeichen ist:

| Zeichen | Bedeutung |
|---|---|
| * | Steht für beliebig viele Zeichen |
| ? | Steht für genau ein Zeichen |

Beispiel:

    Get-Service -Name "Win*"

Zeigt Dienste an, deren Name mit **Win** beginnt.

Beispiel:

    Get-ChildItem -Path "C:\Temp" -Filter "*.txt"

Zeigt alle Dateien mit der Endung **.txt** an.

---

**Pflichtparameter**

Manche Parameter sind erforderlich.

Wenn ein Pflichtparameter fehlt, fragt PowerShell nach dem fehlenden Wert.

Beispiel:

    Read-Host -Prompt

PowerShell erwartet hier einen Wert für **-Prompt**.

Besser:

    Read-Host -Prompt "Bitte Namen eingeben"

---

**Optionale Parameter**

Viele Parameter sind optional.

Beispiel:

    Get-Process

Dieser Befehl funktioniert ohne weitere Parameter.

Mit optionalem Parameter wird er genauer:

    Get-Process -Name "notepad"

Der Parameter **-Name** ist hier nicht zwingend notwendig, aber nützlich.

---

**Parameter und Pipeline**

PowerShell arbeitet objektorientiert.  
Die Pipeline übergibt nicht nur Text, sondern Objekte von einem Befehl zum nächsten.

Beispiel:

    Get-Process -Name "notepad" | Stop-Process

Bedeutung:

| Teil | Erklärung |
|---|---|
| Get-Process -Name "notepad" | Sucht den Prozess notepad |
| Pipe-Zeichen | Übergibt das gefundene Objekt weiter |
| Stop-Process | Beendet den übergebenen Prozess |

Noch deutlicher:

    Get-Process -Name "notepad" | Stop-Process -Force

Hier beendet PowerShell den Prozess **notepad** erzwungen.

---

**Pipeline-Parameter**

Einige Parameter können Werte aus der Pipeline annehmen.

Beispiel:

    Get-Service -Name "Spooler" | Stop-Service

Der Dienst wird zuerst gesucht und dann an **Stop-Service** weitergegeben.

PowerShell erkennt anhand des Objekttyps, welcher Parameter des nächsten Cmdlets den Wert annehmen kann.

Das nennt man auch:

| Begriff | Bedeutung |
|---|---|
| Pipeline Input | Eingabe aus der Pipeline |
| ByValue | Übergabe anhand des Objekttyps |
| ByPropertyName | Übergabe anhand eines passenden Eigenschaftsnamens |

Für die IHK reicht meistens das Grundverständnis:

**Die Pipeline übergibt das Ergebnis eines Befehls an den nächsten Befehl. Parameter können diese übergebenen Werte weiterverarbeiten.**

---

**Common Parameters**

Viele PowerShell-Cmdlets besitzen gemeinsame Standardparameter.

Diese nennt man **Common Parameters**.

Wichtige Beispiele:

| Parameter | Bedeutung |
|---|---|
| -Verbose | Gibt ausführlichere Informationen aus |
| -Debug | Gibt Debug-Informationen aus |
| -ErrorAction | Legt fest, wie Fehler behandelt werden |
| -ErrorVariable | Speichert Fehler in einer Variable |
| -WarningAction | Legt fest, wie Warnungen behandelt werden |
| -OutVariable | Speichert die Ausgabe in einer Variable |
| -PipelineVariable | Speichert Pipeline-Objekte in einer Variable |

Beispiel:

    Get-Service -Name "Spooler" -Verbose

Mit **-Verbose** können zusätzliche Informationen angezeigt werden.

---

**Fehlerbehandlung mit Parametern**

Ein wichtiger Parameter ist **-ErrorAction**.

Damit legt man fest, wie PowerShell bei Fehlern reagieren soll.

Beispiel:

    Get-Item -Path "C:\NichtVorhanden" -ErrorAction SilentlyContinue

Bedeutung:

PowerShell gibt keinen sichtbaren Fehler aus, wenn der Pfad nicht existiert.

Häufige Werte für **-ErrorAction**:

| Wert | Bedeutung |
|---|---|
| Continue | Fehler anzeigen und weitermachen |
| Stop | Fehler anzeigen und Ausführung stoppen |
| SilentlyContinue | Fehler nicht anzeigen und weitermachen |
| Inquire | Nachfrage anzeigen |
| Ignore | Fehler ignorieren |

---

**Parameter herausfinden**

Man muss nicht alle Parameter auswendig kennen.

PowerShell bietet Hilfe-Befehle.

Wichtige Befehle:

    Get-Help Get-ChildItem

Zeigt Hilfe zum Cmdlet an.

    Get-Help Get-ChildItem -Detailed

Zeigt ausführlichere Informationen.

    Get-Help Get-ChildItem -Examples

Zeigt Beispiele.

    Get-Command Get-ChildItem -Syntax

Zeigt die Syntax des Cmdlets.

    Get-Command Get-ChildItem | Select-Object -ExpandProperty Parameters

Zeigt die verfügbaren Parameter eines Cmdlets.

---

**Syntax in der Hilfe verstehen**

Bei PowerShell-Hilfeausgaben sieht man oft eckige Klammern.

Beispiel:

    Get-ChildItem [[-Path] <string[]>] [-Filter <string>] [-Recurse]

Bedeutung:

| Schreibweise | Bedeutung |
|---|---|
| [-Path] | Parameter ist optional |
| <string[]> | Erwartet einen oder mehrere Textwerte |
| [-Filter <string>] | Optionaler Parameter mit Textwert |
| [-Recurse] | Optionaler Schalterparameter |

Wichtig:

Eckige Klammern bedeuten in der Syntax meistens: **optional**.

---

**Cmdlet-Namen und Parameter**

PowerShell-Cmdlets folgen meistens dem Verb-Nomen-Schema.

Beispiele:

| Cmdlet | Bedeutung |
|---|---|
| Get-Process | Prozesse abrufen |
| Stop-Process | Prozess beenden |
| Get-Service | Dienste abrufen |
| Start-Service | Dienst starten |
| Stop-Service | Dienst stoppen |
| Get-ChildItem | Ordnerinhalt anzeigen |
| Remove-Item | Datei/Ordner löschen |
| New-Item | Datei/Ordner erstellen |
| Copy-Item | Datei/Ordner kopieren |
| Move-Item | Datei/Ordner verschieben |

Parameter passen sich an das jeweilige Cmdlet an.

Beispiel:

    Get-Service -Name "Spooler"

    Stop-Service -Name "Spooler"

Beide Befehle nutzen **-Name**, aber mit unterschiedlicher Aktion.

---

**Aliase und Parameter**

PowerShell besitzt auch Kurzformen, sogenannte Aliase.

Beispiele:

| Alias | Eigentliches Cmdlet |
|---|---|
| dir | Get-ChildItem |
| ls | Get-ChildItem |
| cd | Set-Location |
| copy | Copy-Item |
| del | Remove-Item |
| cat | Get-Content |

Beispiel:

    dir "C:\Temp"

Das entspricht ungefähr:

    Get-ChildItem -Path "C:\Temp"

Für die IHK und Dokumentation ist das ausgeschriebene Cmdlet besser, weil es eindeutiger ist.

---

**Parameter in eigenen Skripten**

Auch eigene PowerShell-Skripte können Parameter besitzen.

Beispiel:

    param(
        [string]$Name
    )

    Write-Output "Hallo $Name"

Wenn das Skript zum Beispiel **gruss.ps1** heißt, kann man es so starten:

    .\gruss.ps1 -Name "Felix"

Ausgabe:

    Hallo Felix

---

**Mehrere eigene Parameter**

Beispiel:

    param(
        [string]$Name,
        [int]$Alter
    )

    Write-Output "$Name ist $Alter Jahre alt."

Aufruf:

    .\person.ps1 -Name "Felix" -Alter 30

Hier sind:

| Teil | Bedeutung |
|---|---|
| -Name | Parameter für den Namen |
| "Felix" | Wert für den Namen |
| -Alter | Parameter für das Alter |
| 30 | Wert für das Alter |

---

**Pflichtparameter in eigenen Skripten**

Man kann Parameter als verpflichtend kennzeichnen.

Beispiel:

    param(
        [Parameter(Mandatory=$true)]
        [string]$Name
    )

    Write-Output "Hallo $Name"

Wenn der Parameter **-Name** beim Start fehlt, fragt PowerShell nach.

---

**Parameter mit Standardwert**

Parameter können Standardwerte besitzen.

Beispiel:

    param(
        [string]$Name = "Benutzer"
    )

    Write-Output "Hallo $Name"

Wenn kein Name angegeben wird, verwendet PowerShell automatisch **Benutzer**.

---

**Parameter validieren**

PowerShell kann Parameterwerte prüfen.

Beispiel mit erlaubten Werten:

    param(
        [ValidateSet("Start","Stop","Restart")]
        [string]$Aktion
    )

    Write-Output "Gewählte Aktion: $Aktion"

Jetzt darf der Parameter **-Aktion** nur bestimmte Werte annehmen:

| Erlaubter Wert |
|---|
| Start |
| Stop |
| Restart |

Beispiel:

    .\dienst.ps1 -Aktion Start

Ein falscher Wert würde abgelehnt werden.

---

**Typische IHK-relevante Beispiele**

**Dienst anzeigen**

    Get-Service -Name "Spooler"

Zeigt den Dienst **Spooler** an.

---

**Dienst starten**

    Start-Service -Name "Spooler"

Startet den Dienst **Spooler**.

---

**Dienst stoppen**

    Stop-Service -Name "Spooler"

Stoppt den Dienst **Spooler**.

---

**Prozess anzeigen**

    Get-Process -Name "notepad"

Zeigt den Prozess **notepad** an.

---

**Prozess beenden**

    Stop-Process -Name "notepad"

Beendet den Prozess **notepad**.

---

**Dateien in einem Ordner anzeigen**

    Get-ChildItem -Path "C:\Temp"

Zeigt den Inhalt des Ordners **C:\Temp** an.

---

**Dateien rekursiv suchen**

    Get-ChildItem -Path "C:\Temp" -Filter "*.log" -Recurse

Sucht im Ordner **C:\Temp** und allen Unterordnern nach **.log-Dateien**.

---

**Datei löschen mit Sicherheitsprüfung**

    Remove-Item -Path "C:\Temp\test.txt" -WhatIf

Zeigt an, was gelöscht werden würde, löscht aber nicht wirklich.

---

**Datei löschen mit Bestätigung**

    Remove-Item -Path "C:\Temp\test.txt" -Confirm

Fragt vor dem Löschen nach.

---

**Wichtige Begriffe**

| Begriff | Erklärung |
|---|---|
| Cmdlet | PowerShell-Befehl im Verb-Nomen-Schema |
| Parameter | Zusatzangabe zu einem Cmdlet |
| Parameterwert | Konkreter Wert zu einem Parameter |
| Schalterparameter | Parameter ohne eigenen Wert |
| Pflichtparameter | Muss angegeben werden |
| Optionaler Parameter | Kann angegeben werden, muss aber nicht |
| Positioneller Parameter | Kann ohne Parameternamen verwendet werden |
| Pipeline | Übergibt Objekte von einem Befehl zum nächsten |
| Common Parameters | Gemeinsame Standardparameter vieler Cmdlets |
| Alias | Kurzname für ein Cmdlet |

---

**Häufige Fehler**

| Fehler | Erklärung |
|---|---|
| Parameter falsch geschrieben | PowerShell erkennt den Parameter nicht |
| Wert fehlt | Ein Parameter erwartet einen Wert |
| Falscher Datentyp | Zum Beispiel Text statt Zahl |
| Pfad ohne Anführungszeichen | Fehler bei Leerzeichen im Pfad möglich |
| Zu gefährlicher Befehl ohne -WhatIf | Aktion wird direkt ausgeführt |
| Alias statt Cmdlet in Dokumentation | Kann unklar oder weniger professionell wirken |

---

**Gute Praxis**

| Empfehlung | Grund |
|---|---|
| Parameter ausschreiben | Bessere Lesbarkeit |
| Cmdlets statt Aliase verwenden | Eindeutiger und professioneller |
| Bei gefährlichen Befehlen -WhatIf nutzen | Verhindert versehentliche Änderungen |
| Pfade mit Leerzeichen in Anführungszeichen setzen | Vermeidet Fehler |
| Get-Help nutzen | Parameter müssen nicht auswendig gelernt werden |
| Befehle erst testen | Besonders bei Löschen, Stoppen oder Ändern |

---

**IHK-Einordnung**

Für die IHK ist vor allem wichtig, dass man das Prinzip versteht.

Man muss normalerweise nicht jeden Parameter auswendig kennen.

Wichtig ist:

| Prüfungsrelevanter Punkt | Erklärung |
|---|---|
| Cmdlet erkennen | PowerShell-Befehl verstehen |
| Parameter erkennen | Zusatzangabe zum Befehl erkennen |
| Parameterwert erkennen | Konkreten Wert zuordnen |
| Schalterparameter verstehen | Parameter ohne eigenen Wert |
| Pipeline verstehen | Ausgabe eines Befehls wird weitergegeben |
| Sichere Ausführung verstehen | -WhatIf und -Confirm kennen |
| Hilfe verwenden können | Get-Help und Get-Command kennen |

---

**Prüfungsnahes Beispiel**

Aufgabe:

Ein Administrator möchte alle Textdateien im Ordner **C:\Temp** und dessen Unterordnern anzeigen lassen.

Passender PowerShell-Befehl:

    Get-ChildItem -Path "C:\Temp" -Filter "*.txt" -Recurse

Erklärung:

| Teil | Bedeutung |
|---|---|
| Get-ChildItem | Ordnerinhalt anzeigen |
| -Path "C:\Temp" | Startordner festlegen |
| -Filter "*.txt" | Nur Textdateien anzeigen |
| -Recurse | Unterordner einbeziehen |

---

**Prüfungsnahes Beispiel mit Sicherheit**

Aufgabe:

Ein Administrator möchte prüfen, welche Dateien durch einen Löschbefehl betroffen wären, ohne sie wirklich zu löschen.

Passender PowerShell-Befehl:

    Remove-Item -Path "C:\Temp\*.log" -WhatIf

Erklärung:

| Teil | Bedeutung |
|---|---|
| Remove-Item | Elemente löschen |
| -Path "C:\Temp\*.log" | Alle .log-Dateien im Zielpfad |
| -WhatIf | Nur anzeigen, was passieren würde |

---

**Zusammenfassung**

Parameter sind ein zentrales Konzept in PowerShell.

Sie steuern, wie ein Cmdlet arbeitet und auf welche Objekte es angewendet wird.

Die wichtigsten Punkte:

| Punkt | Kurz erklärt |
|---|---|
| Parameter steuern Cmdlets | Sie machen Befehle genauer |
| Manche Parameter brauchen Werte | Zum Beispiel -Name "Spooler" |
| Schalterparameter brauchen keinen Wert | Zum Beispiel -Recurse oder -Force |
| Parameter können kombiniert werden | Dadurch entstehen gezielte Befehle |
| -WhatIf und -Confirm erhöhen die Sicherheit | Besonders bei gefährlichen Aktionen |
| Get-Help zeigt verfügbare Parameter | Man muss nicht alles auswendig kennen |
| Die Pipeline übergibt Objekte weiter | Cmdlets können miteinander kombiniert werden |

---

**Kurzer Merksatz**

**Ein Parameter ist eine Zusatzangabe zu einem PowerShell-Cmdlet, mit der festgelegt wird, worauf und wie der Befehl angewendet wird.**

**Beispiel:**

    Get-Service -Name "Spooler"

**Get-Service** ist das Cmdlet.  
**-Name** ist der Parameter.  
**"Spooler"** ist der Parameterwert.