Grundlegendes zu PSModulePath
Kurze Beschreibung
In diesem Artikel werden der Zweck und die Verwendung der $env:PSModulePath
Umgebungsvariablen beschrieben.
Lange Beschreibung
Die Umgebungsvariable $env:PSModulePath
enthält eine Liste von Ordnerspeicherorten, die nach Modulen und Ressourcen gesucht werden. PowerShell durchsucht rekursiv jeden Ordner nach Moduldateien (.psd1
oder .psm1
).
Install-Module
verfügt über einen Scope-Parameter , mit dem Sie angeben können, ob das Modul für den aktuellen Benutzer oder für alle Benutzer installiert ist. Weitere Informationen finden Sie unter Install-Module.
Standardmäßig sind folgende effektive Standorte zugewiesen $env:PSModulePath
:
Systemweite Speicherorte: Diese Ordner enthalten Module, die im Lieferumfang von PowerShell enthalten sind. Diese Module werden im
$PSHOME\Modules
Ordner gespeichert.- Unter Windows werden module, die im Bereich AllUsers installiert sind, in
$env:ProgramFiles\WindowsPowerShell\Modules
gespeichert. - Auf Nicht-Windows-Systemen werden Module, die im Bereich AllUsers installiert sind, in
/usr/local/share/powershell/Modules
gespeichert.
- Unter Windows werden module, die im Bereich AllUsers installiert sind, in
Vom Benutzer installierte Module: Unter Windows werden module, die im CurrentUser-Bereich installiert sind, in der Regel im
$HOME\Documents\WindowsPowerShell\Modules
Ordner gespeichert. Der spezifische Speicherort des OrdnersDocuments
variiert je nach Version von Windows und nach Verwendung der Ordnerumleitung. Außerdem kann Microsoft OneDrive den Speicherort IhresDocuments
Ordners ändern. Sie können den Speicherort IhresDocuments
Ordners mit dem folgenden Befehl überprüfen:[Environment]::GetFolderPath('MyDocuments')
.Auf Nicht-Windows-Systemen werden module, die im CurrentUser-Bereich installiert sind, im
$HOME/.local/share/powershell/Modules
Ordner gespeichert.Anwendungsspezifische Module: Setupprogramme können Module in anderen Verzeichnissen installieren, z. B. im
Program Files
Ordner unter Windows. Das Installationspaket kann den Speicherort an das$env:PSModulePath
anfügen oder nicht.
PowerShell PSModulePath-Konstruktion
Der Wert von wird bei jedem Start von $env:PSModulePath
PowerShell erstellt.
Der Wert variiert je nach Version von PowerShell und dessen Start.
Windows PowerShell Start
Windows PowerShell verwendet die folgende Logik, um die PSModulePath
beim Start zu erstellen:
- Wenn
PSModulePath
nicht vorhanden, kombinieren Sie CurrentUser, AllUsers und die$PSHOME
Modulpfade. - Wenn
PSModulePath
vorhanden:- Wenn
PSModulePath
den Modulpfad enthält$PSHOME
:- Der Modulpfad "AllUsers " wird vor dem
$PSHOME
Modulpfad eingefügt.
- Der Modulpfad "AllUsers " wird vor dem
- oder:
- Verwenden Sie
PSModulePath
einfach wie definiert, da der Benutzer den$PSHOME
Speicherort absichtlich entfernt hat.
- Verwenden Sie
- Wenn
Dem CurrentUser-Modulpfad wird nur dann das Präfix vorangestellt, wenn der Bereich $env:PSModulePath
User nicht vorhanden ist. Andernfalls wird der Benutzerbereich $env:PSModulePath
wie definiert verwendet.
PowerShell 7-Start
In Windows verwendet ein neuer Prozess für die meisten Umgebungsvariablen diesen Wert nur, wenn eine Variable mit demselben Namen vorhanden ist.
In PowerShell 7 PSModulePath
wird ähnlich wie die Path
Umgebungsvariable unter Windows behandelt. Unter Windows Path
wird anders behandelt als andere Umgebungsvariablen. Wenn ein Prozess gestartet wird, kombiniert Windows den Benutzerbereich Path
mit dem computerbezogenen Path
.
- Abrufen des Benutzerbereichs
PSModulePath
- Vergleichen mit einer vererbten Umgebungsvariablen
PSModulePath
- Wenn dasselbe gilt:
- Fügen Sie die AllUsers nach der Semantik der Umgebungsvariablen
PSModulePath
an dasPath
Ende an. - Der Windows-Pfad
System32
stammt von dem definiertenPSModulePath
Computer und muss daher nicht explizit hinzugefügt werden.
- Fügen Sie die AllUsers nach der Semantik der Umgebungsvariablen
- Wenn anders, behandeln Sie es so, als ob der Benutzer sie explizit geändert hätte, und fügen Sie nicht AllUsers an.
PSModulePath
- Wenn dasselbe gilt:
- Präfix mit PS7-Benutzer, System und
$PSHOME
Pfaden in dieser Reihenfolge- Wenn
powershell.config.json
einen BenutzerbereichPSModulePath
enthält, verwenden Sie diese anstelle der Standardeinstellung für den Benutzer. - Wenn
powershell.config.json
einen SystembereichPSModulePath
enthält, verwenden Sie diese anstelle der Standardeinstellung für das System.
- Wenn
Unix-Systeme verfügen nicht über eine Trennung von Benutzer- und Systemumgebungsvariablen.
PSModulePath
wird geerbt, und die PS7-spezifischen Pfade erhalten ein Präfix, wenn sie noch nicht definiert sind.
Starten Windows PowerShell über PowerShell 7
Für diese Diskussion bedeutet Windows PowerShell sowohl als auch powershell.exe
powershell_ise.exe
.
Der Wert von $env:PSModulePath
wird mit den folgenden Änderungen in WinPSModulePath
kopiert:
- Entfernen sie PS7, den Pfad des Benutzermoduls.
- Entfernen von PS7: Pfad des Systemmoduls
- Entfernen des PS7-Modulpfads
$PSHOME
Die PS7-Pfade werden entfernt, sodass PS7-Module nicht in Windows PowerShell geladen werden. Der WinPSModulePath
Wert wird beim Starten Windows PowerShell verwendet.
Starten von PowerShell 7 über Windows PowerShell
Der PowerShell 7-Start wird unverändert fortgesetzt, und es werden die hinzugefügten Pfade hinzugefügt, die hinzugefügt Windows PowerShell. Da den PS7-spezifischen Pfaden das Präfix vorangestellt ist, liegt kein Funktionales Problem vor.
Modulsuchverhalten
PowerShell durchsucht rekursiv jeden Ordner im PSModulePath nach Moduldateien (.psd1
oder .psm1
). Dieses Suchmuster ermöglicht die Installation mehrerer Versionen desselben Moduls in verschiedenen Ordnern. Beispiel:
Directory: C:\Program Files\WindowsPowerShell\Modules\PowerShellGet
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 8/14/2020 5:56 PM 1.0.0.1
d---- 9/13/2019 3:53 PM 2.1.2
Standardmäßig lädt PowerShell die höchste Versionsnummer eines Moduls, wenn mehrere Versionen gefunden werden. Verwenden Sie Import-Module
zum Laden einer bestimmten Version mit dem Parameter FullyQualifiedName . Weitere Informationen finden Sie unter Import-Module.
Ändern von PSModulePath
In den meisten Fällen sollten Sie Module an den Standardspeicherorten des Moduls installieren. Möglicherweise müssen Sie jedoch den Wert der PSModulePath
Umgebungsvariablen ändern.
Um beispielsweise vorübergehend das Verzeichnis $env:PSModulePath
für die C:\Program Files\Fabrikam\Modules
aktuelle Sitzung hinzuzufügen, geben Sie Folgendes ein:
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
Das Semikolon (;
) im Befehl trennt den neuen Pfad von dem Pfad, der ihm in der Liste vorangestellt ist. Auf Nicht-Windows-Plattformen trennt der Doppelpunkt (:
) die Pfadspeicherorte in der Umgebungsvariablen.
Ändern von PSModulePath in Nicht-Windows
Um den Wert von PSModulePath
für jede Sitzung in einer Nicht-Windows-Umgebung zu ändern, fügen Sie dem PowerShell-Profil den vorherigen Befehl hinzu.
Ändern von PSModulePath in Windows
Um den Wert von PSModulePath
in jeder Sitzung zu ändern, bearbeiten Sie den Registrierungsschlüssel, der die PSModulePath
Werte speichert. Die PSModulePath
Werte werden in der Registrierung als nicht erweiterte Zeichenfolgen gespeichert. Um das dauerhafte Speichern der PSModulePath
Werte als erweiterte Zeichenfolgen zu vermeiden, verwenden Sie die GetValue-Methode für den Unterschlüssel, und bearbeiten Sie den Wert direkt.
Im folgenden Beispiel wird der C:\Program Files\Fabrikam\Modules
Pfad dem Wert der PSModulePath
Umgebungsvariablen hinzugefügt, ohne die nicht erweiterten Zeichenfolgen zu erweitern.
$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)
Um der Benutzereinstellung einen Pfad hinzuzufügen, ändern Sie den Registrierungsanbieter von in HKLM:\
HKCU:\
.
$key = (Get-Item 'HKCU:\').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)