Grundlegendes zu PSModulePath
Kurze Beschreibung
In diesem Artikel werden der Zweck und die Verwendung der $env:PSModulePath
Umgebungsvariable beschrieben.
Lange Beschreibung
Die Umgebungsvariable $env:PSModulePath
enthält eine Liste von Ordnerspeicherorten. PowerShell durchsucht rekursiv jeden Ordner nach Moduldateien (.psd1
oder .psm1
) Dateien.
Standardmäßig sind die zugewiesenen $env:PSModulePath
effektiven Speicherorte:
- Module, die im CurrentUser-Bereich installiert sind:
- Unter Windows werden diese Module in
$HOME\Documents\PowerShell\Modules
gespeichert. Der spezifische Speicherort desDocuments
Ordners variiert je nach Windows-Version und wenn Sie die Ordnerumleitung verwenden. Außerdem kann Microsoft OneDrive den Speicherort IhresDocuments
Ordners ändern. Um den Speicherort IhresDocuments
Ordners zu überprüfen, führen Sie den folgenden Befehl aus:[Environment]::GetFolderPath('MyDocuments')
- Auf Nicht-Windows-Systemen werden diese Module im
$HOME/.local/share/powershell/Modules
Ordner gespeichert.
- Unter Windows werden diese Module in
- Module, die im Bereich "AllUsers " installiert sind:
- Unter Windows werden diese Module in
$env:ProgramFiles\PowerShell\Modules
gespeichert. - Auf Nicht-Windows-Systemen werden diese Module in
/usr/local/share/powershell/Modules
gespeichert.
- Unter Windows werden diese Module in
- Module, die mit PowerShell ausgeliefert werden, werden in
$PSHOME\Modules
.
Hinweis
Anwendungen, die PowerShell-Module enthalten, können Module in anderen Verzeichnissen unter Windows installieren, z. B. den Program Files
Ordner. Das Installer-Paket fügt den Speicherort möglicherweise nicht an die $env:PSModulePath
Datei an.
Die Standardspeicherorte für Windows PowerShell 5.1 unterscheiden sich von PowerShell 7.
- Module, die im CurrentUser-Bereich installiert sind, werden in
$HOME\Documents\WindowsPowerShell\Modules
gespeichert. - Module, die im AllUsers-Bereich installiert sind, werden in
$env:ProgramFiles\WindowsPowerShell\Modules
gespeichert. - Module, die mit Windows PowerShell ausgeliefert werden, die in
$PSHOME\Modules
, d. h$env:SystemRoot\System32\WindowsPowerShell\1.0\Modules
.
PowerShell PSModulePath-Konstruktion
Der Wert wird $env:PSModulePath
jedes Mal erstellt, wenn PowerShell gestartet wird.
Der Wert variiert je nach Version von PowerShell und wie Sie es gestartet haben.
Windows PowerShell-Start
Windows PowerShell verwendet die folgende Logik, um den PSModulePath
Start zu erstellen:
- Wenn
PSModulePath
nicht vorhanden, kombinieren Sie CurrentUser, AllUsers und die$PSHOME
Modulpfade. - Falls
PSModulePath
vorhanden:$PSHOME
EnthältPSModulePath
Modulpfad:- Der Pfad für AllUsers-Module wird vor dem
$PSHOME
Modulpfad eingefügt.
- Der Pfad für AllUsers-Module wird vor dem
- oder:
- Verwenden
PSModulePath
Sie einfach wie definiert, da der Benutzer den Speicherort absichtlich entfernt hat$PSHOME
.
- Verwenden
Der Pfad des CurrentUser-Moduls 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 nur diesen Wert, selbst wenn eine Variable mit Computerbereich mit demselben Namen vorhanden ist. Die Pfadumgebungsvariablen werden unterschiedlich behandelt.
Unter Windows PSModulePath
wird ähnlich behandelt wie die Path
Umgebungsvariable behandelt wird. Path
wird anders behandelt als andere Umgebungsvariablen. Wenn ein Prozess gestartet wird, kombiniert Windows den vom Benutzer definierten Path
Bereich mit dem Computerbereich Path
.
- Abrufen des Benutzerbereichs
PSModulePath
- Vergleich mit verarbeiteter geerbter Umgebungsvariable
PSModulePath
- Wenn dies derselbe ist:
- Anfügen der AllUsers
PSModulePath
an das Ende nach der Semantik derPath
Umgebungsvariable - Der Windows-Pfad
System32
stammt aus dem computerdefiniert,PSModulePath
sodass er nicht explizit hinzugefügt werden muss.
- Anfügen der AllUsers
- Wenn anders, behandeln Sie es, als ob der Benutzer sie explizit geändert hat, und fügen Sie "AllUsers" nicht an
PSModulePath
- Wenn dies derselbe ist:
- Präfix mit PS7-Benutzer, System und
$PSHOME
Pfaden in dieser Reihenfolge- Wenn
powershell.config.json
ein Benutzer einen BereichPSModulePath
hat, verwenden Sie dies anstelle der Standardeinstellung für den Benutzer. - Wenn
powershell.config.json
ein Systembereich enthaltenPSModulePath
ist, verwenden Sie dies anstelle der Standardeinstellung für das System.
- Wenn
Nicht-Windows-Systeme weisen keine Trennung von Benutzer- und Systemumgebungsvariablen auf. 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 als powershell_ise.exe
auch powershell.exe
.
Der Wert der $env:PSModulePath
Datei wird mit den folgenden Änderungen kopiert WinPSModulePath
:
- Entfernen des PS7-Pfads des Benutzermoduls
- Entfernen sie PS7 den Systemmodulpfad.
- Entfernen von PS7 des Modulpfads
$PSHOME
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 wird wie folgt fortgesetzt: Es werden pfadvererbte Pfade hinzugefügt, die Von Windows PowerShell 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
) Dateien. 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 Import-Module
zum Laden einer bestimmten Version den 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 PSModulePath
Umgebungsvariable ändern.
Wenn Sie beispielsweise das C:\Program Files\Fabrikam\Modules
Verzeichnis $env:PSModulePath
für die aktuelle Sitzung vorübergehend 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 PSModulePath
für jede Sitzung in einer Nicht-Windows-Umgebung zu ändern, fügen Sie ihrem PowerShell-Profil den vorherigen Befehl hinzu.
Ändern von PSModulePath in Windows
Um den Wert in PSModulePath
jeder Sitzung zu ändern, bearbeiten Sie den Registrierungsschlüssel, der die PSModulePath
Werte speichert. Die PSModulePath
Werte werden in der Registrierung als nichtexpandierte 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\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)
Verwenden Sie den folgenden Code, um der Benutzereinstellung einen Pfad hinzuzufügen:
$key = (Get-Item 'HKCU:\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)