Skip to main content

PowerShell – Eigene Parameter definieren

Neben der Verwendung vorhandener Parameter kann man in PowerShell auch eigene Parameter für Skripte und Funktionen definieren.

Dadurch muss man Werte nicht fest im Skript eintragen, sondern kann sie beim Start des Skripts übergeben.


Warum eigene Parameter sinnvoll sind

Ohne Parameter wären Werte oft fest im Skript eingetragen.

Beispiel ohne Parameter:

$Name = "Felix"
Write-Output "Hallo $Name"

Das Problem:

Der Name ist fest im Skript eingetragen.
Wenn ein anderer Name verwendet werden soll, muss das Skript geändert werden.

Besser ist ein Parameter:

param(
    [string]$Name
)

Write-Output "Hallo $Name"

Aufruf:

.\gruss.ps1 -Name "Felix"

Ausgabe:

Hallo Felix

Der param()-Block

Eigene Parameter werden in PowerShell meistens mit einem param()-Block definiert.

Der param()-Block steht in Skripten normalerweise am Anfang der Datei.

Grundform:

param(
    [Datentyp]$Parametername
)

Beispiel:

param(
    [string]$Name
)

Write-Output "Hallo $Name"

Bedeutung:

Teil Erklärung
param() Bereich, in dem Parameter definiert werden
[string] Datentyp des Parameters
$Name Name des Parameters als Variable

Parameter beim Skriptstart übergeben

Ein Skript mit Parameter kann beim Start Werte annehmen.

Beispielskript:

param(
    [string]$Name,
    [int]$Alter
)

Write-Output "$Name ist $Alter Jahre alt."

Aufruf:

.\person.ps1 -Name "Felix" -Alter 30

Bedeutung:

Teil Erklärung
.\person.ps1 Skript wird gestartet
-Name Parametername
"Felix" Wert für den Parameter Name
-Alter Parametername
30 Wert für den Parameter Alter

Datentypen bei Parametern

Man kann festlegen, welchen Datentyp ein Parameter erwartet.

Beispiele:

Datentyp Bedeutung Beispiel
[string] Text "Felix"
[int] Ganze Zahl 30
[bool] Wahr/Falsch $true
[string[]] Mehrere Texte "PC1","PC2"
[switch] Schalterparameter -VerboseMode

Beispiel:

param(
    [string]$ComputerName,
    [int]$Port
)

Write-Output "Computer: $ComputerName"
Write-Output "Port: $Port"

Aufruf:

.\test.ps1 -ComputerName "Server01" -Port 443

Parameter mit Standardwert

Ein Parameter kann einen Standardwert haben.

Wenn beim Aufruf kein Wert angegeben wird, verwendet PowerShell automatisch den Standardwert.

Beispiel:

param(
    [string]$Name = "Benutzer"
)

Write-Output "Hallo $Name"

Aufruf ohne Parameter:

.\gruss.ps1

Ausgabe:

Hallo Benutzer

Aufruf mit Parameter:

.\gruss.ps1 -Name "Felix"

Ausgabe:

Hallo Felix

Pflichtparameter

Ein Parameter kann verpflichtend gemacht werden.

Dafür verwendet man das Attribut:

[Parameter(Mandatory)]

Beispiel:

param(
    [Parameter(Mandatory)]
    [string]$Name
)

Write-Output "Hallo $Name"

Wenn der Parameter beim Aufruf fehlt, fragt PowerShell nach dem Wert.

Aufruf:

.\gruss.ps1

PowerShell fragt dann nach dem fehlenden Parameter.


Parameter-Attribut

Mit [Parameter()] kann man Eigenschaften eines Parameters festlegen.

Beispiel:

param(
    [Parameter(Mandatory)]
    [string]$ComputerName
)

Wichtige Eigenschaften:

Eigenschaft Bedeutung
Mandatory Parameter ist verpflichtend
Position Parameter kann über seine Position erkannt werden
ValueFromPipeline Wert kann aus der Pipeline kommen
ValueFromPipelineByPropertyName Wert kann über passenden Eigenschaftsnamen aus der Pipeline kommen
HelpMessage Hilfetext für den Parameter

Positionelle Parameter

Parameter können auch über ihre Position übergeben werden.

Beispiel:

param(
    [Parameter(Position=0)]
    [string]$Name,

    [Parameter(Position=1)]
    [int]$Alter
)

Write-Output "$Name ist $Alter Jahre alt."

Aufruf mit Parameternamen:

.\person.ps1 -Name "Felix" -Alter 30

Aufruf über Position:

.\person.ps1 "Felix" 30

PowerShell erkennt:

Position Wert Parameter
0 "Felix" Name
1 30 Alter

Für saubere Dokumentation ist die Variante mit Parameternamen meist besser.


Parameter validieren

Parameterwerte können geprüft werden.

Dadurch kann verhindert werden, dass falsche Werte verarbeitet werden.


ValidateSet

Mit ValidateSet kann man erlaubte Werte festlegen.

Beispiel:

param(
    [ValidateSet("Start","Stop","Restart")]
    [string]$Action
)

Write-Output "Gewählte Aktion: $Action"

Erlaubte Aufrufe:

.\dienst.ps1 -Action Start

.\dienst.ps1 -Action Stop

.\dienst.ps1 -Action Restart

Nicht erlaubt:

.\dienst.ps1 -Action Delete

PowerShell würde den falschen Wert ablehnen.


ValidateNotNullOrEmpty

Mit ValidateNotNullOrEmpty wird verhindert, dass ein leerer Wert übergeben wird.

Beispiel:

param(
    [ValidateNotNullOrEmpty()]
    [string]$Name
)

Write-Output "Hallo $Name"

Das ist sinnvoll, wenn ein Parameter zwar angegeben wird, aber nicht leer sein darf.


Schalterparameter selbst definieren

Schalterparameter werden mit [switch] definiert.

Ein Schalterparameter braucht keinen eigenen Wert.

Beispiel:

param(
    [switch]$Ausfuehrlich
)

if ($Ausfuehrlich) {
    Write-Output "Ausführliche Ausgabe aktiviert"
} else {
    Write-Output "Normale Ausgabe"
}

Aufruf ohne Schalter:

.\test.ps1

Aufruf mit Schalter:

.\test.ps1 -Ausfuehrlich

Bedeutung:

Der Parameter ist aktiv, sobald er angegeben wird.


Parameter in Funktionen

Parameter können nicht nur in Skripten, sondern auch in Funktionen verwendet werden.

Beispiel:

function Begruessung {
    param(
        [string]$Name
    )

    Write-Output "Hallo $Name"
}

Aufruf:

Begruessung -Name "Felix"

Ausgabe:

Hallo Felix

Erweiterte Funktion mit Parametern

Eine etwas sauberere Funktion:

function Test-Verbindung {
    param(
        [Parameter(Mandatory)]
        [string]$ComputerName
    )

    Test-Connection -ComputerName $ComputerName -Count 2
}

Aufruf:

Test-Verbindung -ComputerName "server01"

Hier nimmt die eigene Funktion den Parameter -ComputerName entgegen und verwendet ihn intern für Test-Connection.


Unbenannte Parameter mit $args

PowerShell kann auch über $args Werte entgegennehmen.

Beispiel:

Write-Output "Erster Wert: $($args[0])"
Write-Output "Zweiter Wert: $($args[1])"

Aufruf:

.\test.ps1 Felix Berlin

Ausgabe:

Erster Wert: Felix
Zweiter Wert: Berlin

Das funktioniert, ist aber weniger sauber als ein richtiger param()-Block.

Besser:

param(
    [string]$Name,
    [string]$Ort
)

Write-Output "$Name aus $Ort"

Aufruf:

.\test.ps1 -Name "Felix" -Ort "Berlin"

Named Parameters vs. Positional Parameters

Es gibt zwei typische Arten, Parameter zu übergeben.

Art Beispiel Erklärung
Named Parameter .\test.ps1 -Name "Felix" Parametername wird angegeben
Positional Parameter .\test.ps1 "Felix" PowerShell erkennt den Parameter über die Position

Named Parameters sind besser lesbar und weniger fehleranfällig.


Mehrere Werte übergeben

Ein Parameter kann mehrere Werte annehmen, wenn er als Array definiert ist.

Beispiel:

param(
    [string[]]$ComputerName
)

foreach ($Computer in $ComputerName) {
    Write-Output "Prüfe $Computer"
}

Aufruf:

.\check.ps1 -ComputerName "PC1","PC2","PC3"

Ausgabe:

Prüfe PC1
Prüfe PC2
Prüfe PC3

Advanced Function und CmdletBinding

Mit [CmdletBinding()] kann eine Funktion sich stärker wie ein echtes Cmdlet verhalten.

Beispiel:

function Remove-TestDatei {
    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter(Mandatory)]
        [string]$Path
    )

    if ($PSCmdlet.ShouldProcess($Path, "Datei löschen")) {
        Remove-Item -Path $Path
    }
}

Vorteil:

Die Funktion unterstützt dadurch zum Beispiel -WhatIf.

Aufruf:

Remove-TestDatei -Path "C:\Temp\test.txt" -WhatIf

PowerShell zeigt dann nur an, was passieren würde.

Das ist besonders wichtig bei Funktionen, die etwas verändern oder löschen.


Warum Parameter besser sind als feste Werte

Schlechter Stil:

$ComputerName = "Server01"
Test-Connection -ComputerName $ComputerName

Besser:

param(
    [string]$ComputerName
)

Test-Connection -ComputerName $ComputerName

Aufruf:

.\ping.ps1 -ComputerName "Server01"

Vorteile:

Vorteil Erklärung
Wiederverwendbar Skript funktioniert mit verschiedenen Werten
Flexibler Werte werden beim Start übergeben
Wartbarer Skript muss nicht ständig geändert werden
Sicherer Werte können validiert werden
Professioneller Entspricht eher echter Administration

IHK-Einordnung

Für die IHK ist vor allem wichtig, das Prinzip zu verstehen:

Ein Parameter macht Skripte und Funktionen flexibel.

Man schreibt nicht alle Werte fest in den Code, sondern übergibt sie beim Aufruf.

Wichtige Punkte:

Punkt Bedeutung
param() Definiert eigene Parameter
[string], [int], [switch] Legt Datentypen fest
Mandatory Macht Parameter verpflichtend
Position Erlaubt positionelle Übergabe
ValidateSet Beschränkt erlaubte Werte
ValidateNotNullOrEmpty Verhindert leere Werte
[switch] Erstellt Schalterparameter
$args Enthält unbenannte Argumente
CmdletBinding Macht Funktionen cmdletähnlicher

Prüfungsnahes Beispiel

Aufgabe:

Ein Skript soll einen Computernamen als Parameter entgegennehmen und eine Verbindung prüfen.

Lösung:

param(
    [Parameter(Mandatory)]
    [string]$ComputerName
)

Test-Connection -ComputerName $ComputerName -Count 2

Aufruf:

.\check.ps1 -ComputerName "Server01"

Erklärung:

Teil Bedeutung
param() Definiert Eingabeparameter
[Parameter(Mandatory)] Parameter ist verpflichtend
[string] Erwartet Text
$ComputerName Variable für den übergebenen Wert
Test-Connection Prüft Netzwerkverbindung
-ComputerName $ComputerName Nutzt den übergebenen Wert

Kurzer Merksatz

Mit param() definiert man eigene Parameter für PowerShell-Skripte oder Funktionen. Dadurch werden Skripte flexibel, wiederverwendbar und professioneller.