$PSScriptRoot in PowerShell – So nutzt du die Variable richtig

$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.

 $PSScriptRoot in PowerShell
 $PSScriptRoot in PowerShell

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.

  • 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.

Der Blogbetreiber und Autor: Markus Elsberger

Über den Autor

Mein Name ist Markus Elsberger und ich beschäftige mich mit der Administration von Windows und Linux-Systemen sowie mit diversen Themen bzgl. Netzwerktechnik. In meiner Lehrtätigkeit erstelle ich verschiedene Szenarien und teste auch verschiedene Konfigurationen, welche ich in diesem Blog festhalten möchte. Unterstütze das Blog mit einer Spende!


Kostenlose Befehlsreferenzen und E-Books
(Netzwerkanalyse, Benutzerverwaltung, Festplattenkonfiguration, u. v. m.)


Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Kostenlose E-Books für die IT-Administration

Steigere deine IT-Kompetenzen

Ebook - 10 Schritte nach der Windows Installation
Close the CTA

Windows 11, Windows Server, Docker, PowerShell Referenzen, Batch, Linux Terminal, 

u.v.m.