Auf diesem Zettel baust du eigene Funktionen mit Parametern, Default-Werten und return — und machst aus deinem Code echte .ps1-Skripte, die du mit eigenen Parametern startest.
function Say-Hello { ... } definiert eine Funktion — aufgerufen wird sie einfach per Namen: Say-Hello (ohne Klammern!).param($Name = "Stranger", $Age = 0) deklariert Parameter mit Default-Werten. Aufruf: Greet-Person -Name "Max" -Age 25.[int]$Number lehnen falsche Typen mit einem Fehler ab — dein Code wird robuster.return! Unterdrücken mit $null = ... oder | Out-Null..\hello.ps1 (aktueller Ordner) oder & "C:\Pfad\hello.ps1" (voller Pfad).Set-ExecutionPolicy RemoteSigned -Scope CurrentUser ausführen.param(...)-Block ganz oben in der Datei macht das ganze Skript parametrisierbar: .\greet.ps1 -Name "Max".Say-Hello { Write-Host "Hello, World!" } Say-Hello
Das Schlüsselwort function definiert eine Funktion. Danach folgen der Name (am besten im Verb-Nomen-Muster wie bei Cmdlets) und der Code in { }. Aufgerufen wird sie einfach per Namen — Say-Hello — ganz ohne Klammern.
function Greet-Person { param($Name = "Stranger") Write-Host "Hello, $Name!" } Greet-Person
Greet-Person (ohne Parameter) aus?Wird beim Aufruf kein -Name übergeben, greift der Default-Wert "Stranger" aus dem param()-Block. Weil der String in doppelten Anführungszeichen steht, wird $Name interpoliert — es erscheint Hello, Stranger!.
hello.ps1 gespeichert und bist mit Set-Location schon im richtigen Ordner. Wie startest du das Skript?Aus Sicherheitsgründen führt PowerShell Skripte im aktuellen Ordner nur mit explizitem Pfad-Präfix aus: .\hello.ps1. Der bloße Dateiname reicht nicht — so kann kein Skript versehentlich einen echten Befehl 'überschatten'. Alternativ geht der volle Pfad: & "C:\Scripts\hello.ps1". Ein Cmdlet Start-Script gibt es nicht.
$A — genau wie $B — nur ganze Zahlen akzeptiert.function Add-Numbers { param($A, [int]$B) return $A + $B } Add-Numbers -A 3 -B 4
Mit [int] vor dem Variablennamen erzwingst du den Datentyp. Der Aufruf Add-Numbers -A "abc" -B 4 schlägt dann sofort mit einer klaren Fehlermeldung fehl, statt irgendwo später falsche Ergebnisse zu liefern. [int] ist die Kurzform von [System.Int32].
function Get-Double { param([int]$Number) Write-Output "Working..." return $Number * 2 } $result = Get-Double -Number 21 Write-Host $result.Count
Die große Falle bei Funktionen: JEDE nicht unterdrückte Ausgabe wird zurückgegeben, nicht nur return! $result ist deshalb ein Array mit zwei Elementen — "Working..." und 42 — also ist $result.Count gleich 2. Willst du nur 42, unterdrücke die Zwischenausgabe mit $null = ... oder | Out-Null (oder nutze Write-Host, das schreibt nur auf die Konsole).
In PowerShell wandert alles, was eine Funktion ausgibt, in den Rückgabewert — return gibt seinen Wert zurück UND beendet die Funktion, ist aber nicht der einzige Weg. Unerwünschte Ausgaben (z. B. von Cmdlets, die etwas zurückliefern) unterdrückst du mit | Out-Null oder $null = .... Ein return ist optional — eine Funktion ganz ohne return ist völlig legal.
param($Name = "Stranger") setzt einen Default, der greift, wenn der Aufrufer nichts übergibt. [int]$Number erzwingt den Typ. | Out-Null schluckt die Ausgabe — wichtig gegen die Rückgabe-Falle. Und & (der Call-Operator) führt ein Skript an einem beliebigen Pfad aus, ohne dass du erst per Set-Location hinwechseln musst.
Set-ExecutionPolicy -Scope CurrentUser
RemoteSigned ist der übliche Kompromiss: Selbst geschriebene, lokale Skripte laufen ohne Weiteres, aber aus dem Internet heruntergeladene brauchen eine digitale Signatur. Mit -Scope CurrentUser gilt die Einstellung nur für dich — dafür brauchst du keine Admin-Rechte.
greet.ps1. Ganz oben kommt ein Skript-Parameter hin: param([string]$Name = "World").Get-Greeting mit einem Parameter [string]$Person, die den Text Hello, <Person>! per return zurückgibt.$Name auf und gib das Ergebnis mit Write-Host aus.Set-Location in den Ordner und starte zweimal: .\greet.ps1 und .\greet.ps1 -Name "Max". Kommt eine ExecutionPolicy-Fehlermeldung, führe vorher Set-ExecutionPolicy RemoteSigned -Scope CurrentUser aus.# greet.ps1 param([string]$Name = "World") function Get-Greeting { param([string]$Person) return "Hello, $Person!" } $message = Get-Greeting -Person $Name Write-Host $message # Ausfuehren (in der PowerShell-Konsole): # Set-Location C:\Scripts # .\greet.ps1 # -> Hello, World! # .\greet.ps1 -Name "Max" # -> Hello, Max!
Der param()-Block ganz oben macht das Skript selbst parametrisierbar — genau wie bei einer Funktion, nur auf Datei-Ebene. Ohne -Name greift der Default "World". Die Funktion kapselt die Logik, return liefert den fertigen String zurück, und Write-Host zeigt ihn an. Das .\-Präfix ist Pflicht, wenn das Skript im aktuellen Ordner liegt.