$PSScriptRoot in PowerShell – was ist das? Wenn du regelmäßig PowerShell-Skripte entwickelst, wirst du schneller oder später über die automatische Variable $PSScriptRoot stolpern.
Sie gehört zu den wichtigsten Hilfsmitteln, wenn es darum geht, Skripte portabel, sauber strukturiert und zuverlässig ausführbar zu machen.
Aber was ist genau diese Variable $PSScriptRoot in PowerShell und wie verwendest du diese?
Was ist $PSScriptRoot?
Die Variable $PSScriptRoot enthält den vollständigen Pfad des Ordners, in dem das aktuell ausgeführte Skript liegt.
Das bedeutet:
- Du musst keine hartkodierten Pfade nutzen.
- Dein Skript bleibt portabel und flexibel.
- Du kannst problemlos weitere Dateien wie JSON-Konfigurationen, Module oder Logs einbinden.
Ein Beispiel zur Verdeutlichung:
Liegt ein Skript unter
C:\Tools\backup.ps1
dann enthält $PSScriptRoot genau diesen Ordnerpfad:
C:\Tools\
Das funktioniert sowohl bei Einzeldateien als auch bei Modulen.

Warum $PSScriptRoot nutzen?
Viele Admins greifen in Skripten zu absoluten Pfaden wie C \Scripts\config.json. Das funktioniert so lange, bis das Skript verschoben wird oder auf einem anderen System laufen soll. Genau hier kommt $PSScriptRoot in PowerShell ins Spiel.
Vorteile:
- Skripte bleiben unabhängig vom Speicherort
- Module können sauber strukturiert werden
- Teamarbeit wird einfacher
- Skripte laufen zuverlässig in Automationen wie Task Scheduler, Intune, SCCM, Azure Automations oder Jenkins
Wenn du professionell mit PowerShell arbeitest, solltest du $PSScriptRoot immer verwenden, sobald ein Skript auf Dateien zugreift.
Praxisbeispiel: Dateien aus dem Skriptverzeichnis einbinden
Angenommen, in deinem Skriptverzeichnis liegen eine Konfigurationsdatei und ein Log-Ordner:
.\config\settings.json
.\logs\
Dann greifst du so darauf zu:
$configPath = Join-Path $PSScriptRoot "config\settings.json"
$logFolder = Join-Path $PSScriptRoot "logs"
Damit bist du unabhängig vom Standort des Skripts. Verschiebst du das komplette Skriptverzeichnis, funktioniert alles weiterhin – ohne Anpassung.
$PSScriptRoot in Modulen
Auch bei PowerShell-Modulen ist die Variable extrem hilfreich.
Beispiel für ein Modul, das Dateien aus seinem eigenen Modulordner lädt:
$data = Get-Content (Join-Path $PSScriptRoot "data\info.txt")
Gerade bei größeren Projekten, bei denen mehrere Module zusammenarbeiten, ist das ein unverzichtbarer Baustein.
Typische Fehler und wie du sie vermeidest
$PSScriptRoot funktioniert nicht in der Konsole
Wichtig:
$PSScriptRoot ist nur in Skripten und Modulen definiert – nicht in der interaktiven Konsole.
Wenn du dort darauf zugreifst, ist die Variable leer. Das ist kein Fehler – sondern bewusst so umgesetzt.
Skript per Punktnotation ausführen
Viele Admins rufen Skripte so auf:
. .\script.ps1
Das nennt sich Dot-Sourcing – und das verändert das Verhalten der Variablen.
Wichtig: Beim Dot-Sourcing wird das Skript im aktuellen Geltungsbereich (Scope) ausgeführt, nicht in einem eigenen Skript-Scope. Daher ist die Variable $PSScriptRoot in diesem Fall undefiniert (leer).
- Variablen aus dem Skript landen im aktuellen Scope
- Das kann zu unerwarteten Nebeneffekten führen
Daher solltest du Skripte, die relative Pfade über $PSScriptRoot nutzen, immer direkt ausführen:
.\script.ps1
Falsche Pfad-Konkatenation
Das hier solltest du nicht tun:
$path = $PSScriptRoot + "\config\settings.json"
Nutze immer Join-Path – sicherer, sauberer und unabhängig vom verwendeten Betriebssystem:
$path = Join-Path $PSScriptRoot "config\settings.json"
Fortgeschritten: $PSScriptRoot und relative Modulpfade
Gerade in größeren Projekten ist es üblich, weitere Module aus Unterordnern einzubinden. Beispiel:
.\Modules\Logging\
.\Modules\Networking\
Dann kannst du dynamisch Module importieren:
$modulePath = Join-Path $PSScriptRoot "Modules\Logging\Logging.psm1"
Import-Module $modulePath -Force
Damit bleibt dein komplettes Projekt sauber portabel.
Praxis-Tipp: Projektstruktur festlegen
Wenn du regelmäßig Skripte baust, solltest du dir eine Standardstruktur anlegen, zum Beispiel:
Mit $PSScriptRoot in PowerShell kannst du die gesamte Struktur dynamisch einbinden:
$scriptPath = Join-Path $PSScriptRoot "Scripts"
$configPath = Join-Path $PSScriptRoot "Config"
$logPath = Join-Path $PSScriptRoot "Logs"
Diese Vorgehensweise ist besonders wichtig, wenn du Skripte später veröffentlichen, verkaufen oder im Unternehmen breit verteilen möchtest.
Fazit
$PSScriptRoot in PowerShell ist eine der zentralen Variablen für jeden, der Skripte professionell nutzen oder entwickeln möchte. Sie macht deine Skripte portabel, sauber strukturiert und zuverlässiger – besonders, wenn du mit zusätzlichen Dateien oder Modulen arbeitest.
Wenn du deine PowerShell-Skripte künftig sauber organisieren willst, solltest du dir angewöhnen, $PSScriptRoot konsequent zu verwenden. Damit verhinderst du viele Fehler schon bevor sie entstehen.










