Skip to main content

Import-Module

Hier passiert das Offensichtliche, das trotzdem erstaunlich oft falsch gemacht wird: Du lädst dein Modul in die aktuelle Session.

Ohne Import bist du einfach nur jemand, der Code hortet.


🔧 Grundbefehl

Import-Module ModulName

PowerShell sucht dein Modul automatisch in den bekannten Modulpfaden ($env:PSModulePath).

Dabei reicht es nicht, dass sich irgendwo eine ModulName.psm1 oder ModulName.psd1 befindet. Ein Modul muss folgende Struktur entsprechen:

ModulName\
    ├── ModulName.psm1
    └── ModulName.psd1 (optional)

Vorraussetzungen:

  • In einem der Verzeichnisse aus $env:PSModulePath muss ein Ordner mit dem Modulnamen existieren.
  • In diesem Ordner muss sich eine gleichnamige Moduldatei (.psm1) oder ein gleichnamiges Manifest (.psd1) befinden.
  • Dateien, die direkt im Modulpfad liegen (ohne entsprechenden Unterordner), werden bei Import-Module ModulName nicht berücksichtigt.
Manifest hat Vorrang

Existieren sowohl ModulName.psd1 als auch ModulName.psm1, wird das Manifest importiert.

Dadurch können zusätzliche Informationen berücksichtigt werden, beispielsweise:

  • weitere Module über NestedModules
  • Abhängigkeiten über RequiredModules
  • Exporte (FunctionsToExport, AliasesToExport usw.)
  • Versions- und Kompatibilitätsinformationen

Deshalb ist ein Manifest der empfohlene Einstiegspunkt für größere Module.


📁 Import über Pfad

Wenn dein Modul irgendwo rumliegt, wo PowerShell es nicht findet:

Import-Module "C:\MeinProjekt\MeinModul.psm1"

Oder direkt das Verzeichnis:

Import-Module "C:\MeinProjekt\MeinModul"

PowerShell nimmt dann automatisch das Manifest (.psd1) oder die Moduldatei (.psm1).


🔁 Erneutes Laden (Reload)

Du änderst Code, aber PowerShell hängt noch am alten Stand fest? Überraschung.

Import-Module MeinModul -Force

-Force lädt das Modul neu, auch wenn es schon geladen ist.

Pflicht beim Entwickeln, außer du stehst auf Selbstverwirrung.


🎯 Selektiver Import

Du musst nicht alles laden. Du kannst gezielt nur bestimmte Dinge importieren:

Import-Module MeinModul -Function Get-Thing

Oder mehrere:

Import-Module MeinModul -Function Get-Thing, Set-Thing

Funktioniert natürlich nur, wenn dein Manifest das auch erlaubt (FunctionsToExport).


🧠 Automatischer Import

Seit neueren PowerShell-Versionen gilt:

Wenn du eine Funktion aus einem Modul aufrufst, wird es automatisch importiert.

Get-Thing

→ PowerShell denkt sich: „Kenn ich nicht… ach warte, da gibt’s ein Modul“

Klingt smart. Ist es auch.
Bis es nicht mehr funktioniert und du nicht weißt warum.


🔍 Geladene Module anzeigen

Get-Module

Alle verfügbaren Module anzeigen:

Get-Module -ListAvailable

Wenn dein Modul hier nicht auftaucht, kannst du lange importieren. Wird nix.


🧹 Modul entfernen

Falls du es wieder loswerden willst:

Remove-Module MeinModul

Hilfreich beim Entwickeln, wenn du nicht mit -Force arbeiten willst.


⚠️ Bereits geladenes Modul

Wenn ein Modul bereits geladen ist und du erneut Import-Module aufrufst, passiert… nichts.

Import-Module MeinModul

PowerShell sagt sich: „Kenn ich schon“ und ignoriert dich stillschweigend.

Das bedeutet:

  • Änderungen im Code werden nicht übernommen
  • Du arbeitest weiter mit der alten Version

Wenn du sicherstellen willst, dass dein Modul wirklich neu geladen wird:

Import-Module MeinModul -Force

Alternativ kannst du es vorher entfernen:

Remove-Module MeinModul Import-Module MeinModul

Wichtig beim Entwickeln:
Wenn sich „irgendwas komisch anfühlt“, ist es erstaunlich oft genau das hier.

Du debugst dann nicht deinen Code.
Du debugst deine Vergangenheit.


Der eigentliche Punkt (den wieder alle ignorieren)

Import ist kein einmaliger Akt, sondern Teil deines Workflows.

  • Entwicklung → ständig -Force
  • Debugging → bewusst laden/entladen
  • Produktion → einmal sauber laden und fertig

Wenn dein Modul sich beim Import komisch verhält, liegt es fast nie am Import.
Es liegt daran, was dein Modul beim Laden tut.

Und genau da trennt sich „läuft irgendwie“ von „ich hab verstanden, was ich da gebaut habe“.