about_PSModulePath
Kurzbeschreibung
In diesem Artikel werden der Zweck und die Verwendung der umgebungsvariablen $env:PSModulePath
beschrieben.
Lange Beschreibung
Die $env:PSModulePath
Umgebungsvariable enthält eine Liste der Ordnerspeicherorte, die durchsucht werden, um Module und Ressourcen zu finden. 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 die effektiven Speicherorte, die $env:PSModulePath
zugewiesen sind:
systemweite Speicherorte: Diese Ordner enthalten Module, die mit PowerShell ausgeliefert werden. Diese Module werden im Ordner
$PSHOME\Modules
gespeichert.- Unter Windows werden module, die im AllUsers Bereich installiert sind, in
$env:ProgramFiles\WindowsPowerShell\Modules
gespeichert. - Auf Nicht-Windows-Systemen werden Module, die im AllUsers Bereich installiert sind, in
/usr/local/share/powershell/Modules
gespeichert.
- Unter Windows werden module, die im AllUsers Bereich installiert sind, in
vom Benutzer installierten Module: Unter Windows werden Module, die im CurrentUser- Bereich installiert sind, in der Regel im ordner
$HOME\Documents\WindowsPowerShell\Modules
gespeichert. Der spezifische Speicherort des ordnersDocuments
variiert je nach Windows-Version und beim Verwenden 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 Ordner
$HOME/.local/share/powershell/Modules
gespeichert.Anwendungsspezifische Module: Setupprogramme können Module in anderen Verzeichnissen installieren, z. B. den Ordner
Program Files
unter Windows. Das Installer-Paket kann den Speicherort an die$env:PSModulePath
anfügen.
PowerShell PSModulePath-Konstruktion
Der Wert von $env:PSModulePath
wird bei jedem Start von PowerShell erstellt.
Der Wert variiert je nach Version von PowerShell und dem Start.
Windows PowerShell-Start
Windows PowerShell verwendet die folgende Logik, um die PSModulePath
beim Start zu erstellen:
- Wenn
PSModulePath
nicht vorhanden ist, kombinieren Sie CurrentUser-, AllUsers-und die$PSHOME
Modulpfade. - Wenn
PSModulePath
vorhanden ist:- Wenn
PSModulePath
$PSHOME
Modulpfad enthält:-
Modulpfad "AllUsers" wird vor
$PSHOME
Modulpfad eingefügt.
-
Modulpfad "AllUsers" wird vor
- oder:
- Verwenden Sie einfach
PSModulePath
wie definiert, da der Benutzer den$PSHOME
Speicherort absichtlich entfernt hat.
- Verwenden Sie einfach
- Wenn
Der CurrentUser Modulpfad wird nur vorangestellt, wenn der Benutzerbereich $env:PSModulePath
nicht vorhanden ist. Andernfalls wird der Benutzerbereich $env:PSModulePath
wie definiert verwendet.
PowerShell 7-Start
Bei den meisten Umgebungsvariablen verwendet ein neuer Prozess für die meisten Umgebungsvariablen diesen Wert nur, wenn eine Variable mit Computerbereich mit demselben Namen vorhanden ist.
In PowerShell 7 wird PSModulePath
ähnlich wie die Path
Umgebungsvariable unter Windows behandelt. Unter Windows wird Path
anders behandelt als andere Umgebungsvariablen. Wenn ein Prozess gestartet wird, kombiniert Windows die vom Benutzer bezogenen Path
mit dem computerbezogenen Path
.
- Abrufen des vom Benutzerbereich
PSModulePath
- Vergleich mit geerbten
PSModulePath
Umgebungsvariablen- Wenn dies derselbe ist:
- Fügen Sie die AllUsers-
PSModulePath
nach der Semantik derPath
Umgebungsvariablen an das Ende an. - Der Pfad "Windows
System32
" stammt von dem Computer, derPSModulePath
definiert ist, sodass er nicht explizit hinzugefügt werden muss.
- Fügen Sie die AllUsers-
- Wenn anders, behandeln Sie es, als ob der Benutzer sie explizit geändert hat, und fügen Sie nicht AllUsers
PSModulePath
- Wenn dies derselbe ist:
- Präfix mit PS7-Benutzer-, System- und
$PSHOME
Pfaden in dieser Reihenfolge- Wenn
powershell.config.json
einen benutzerbezogenenPSModulePath
enthält, verwenden Sie dies anstelle der Standardeinstellung für den Benutzer. - Wenn
powershell.config.json
ein systembereichsbezogenesPSModulePath
enthält, verwenden Sie dies anstelle der Standardeinstellung für das System.
- Wenn
Unix-Systeme haben keine Trennung von Benutzer- und Systemumgebungsvariablen.
PSModulePath
wird geerbt, und die PS7-spezifischen Pfade werden vorangestellt, wenn sie noch nicht definiert sind.
Starten von Windows PowerShell aus PowerShell 7
Für diese Diskussion bedeutet Windows PowerShell- sowohl powershell.exe
als auch powershell_ise.exe
.
Der Wert von $env:PSModulePath
wird mit den folgenden Änderungen in WinPSModulePath
kopiert:
- Entfernen des PS7-Pfads des Benutzermoduls
- Entfernen sie PS7 den Systemmodulpfad.
- Entfernen sie PS7 den
$PSHOME
Modulpfad.
Die PS7-Pfade werden entfernt, sodass PS7-Module nicht in Windows PowerShell geladen werden. Der WinPSModulePath
Wert wird beim Starten von Windows PowerShell verwendet.
Starten von PowerShell 7 über Windows PowerShell
Der PowerShell 7-Start setzt as-is fort, wobei die von Windows PowerShell hinzugefügten Vererbungspfade hinzugefügt wurden. Da die PS7-spezifischen Pfade präfixiert sind, gibt es kein funktionales Problem.
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. Zum 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 zum Laden einer bestimmten Version Import-Module
mit dem Parameter FullyQualifiedName. Weitere Informationen finden Sie unter Import-Module.
Ändern von PSModulePath
In den meisten Fällen sollten Sie Module an den Standardmodulspeicherorten installieren. Möglicherweise müssen Sie jedoch den Wert der umgebungsvariablen PSModulePath
ändern.
Wenn Sie z. B. das C:\Program Files\Fabrikam\Modules
Verzeichnis vorübergehend zu $env:PSModulePath
für die aktuelle Sitzung hinzufügen möchten, geben Sie Folgendes ein:
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
Der Semikolon (;
) im Befehl trennt den neuen Pfad vom Pfad, der ihm in der Liste vorausgeht. Auf Nicht-Windows-Plattformen trennt der Doppelpunkt (:
) die Pfadspeicherorte in der Umgebungsvariable.
Ä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 erweiterten 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 zum 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 HKLM:\
in 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)