Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kurzbeschreibung
In diesem Artikel werden der Zweck und die Verwendung der umgebungsvariablen $Env:PSModulePath beschrieben.
Lange Beschreibung
Die umgebungsvariable $Env:PSModulePath enthält eine Liste der Ordnerspeicherorte. PowerShell durchsucht rekursiv jeden Ordner nach Moduldateien (.psd1 oder .psm1).
Standardmäßig sind die effektiven Speicherorte, die $Env:PSModulePath zugewiesen sind:
- Module, die im Bereich CurrentUser installiert sind:
- Unter Windows werden diese Module in
$HOME\Documents\PowerShell\Modulesgespeichert. Der spezifische Speicherort des ordnersDocumentsvariiert je nach Windows-Version und beim Verwenden der Ordnerumleitung. Außerdem kann Microsoft OneDrive den Speicherort IhresDocumentsOrdners ändern. Um den Speicherort DesDocumentsOrdners zu überprüfen, führen Sie den folgenden Befehl aus:[Environment]::GetFolderPath('MyDocuments'). - Auf Nicht-Windows-Systemen werden diese Module im Ordner
$HOME/.local/share/powershell/Modulesgespeichert.
- Unter Windows werden diese Module in
- Module, die im AllUsers Bereich installiert sind:
- Unter Windows werden diese Module in
$Env:ProgramFiles\PowerShell\Modulesgespeichert. - Auf Nicht-Windows-Systemen werden diese Module in
/usr/local/share/powershell/Modulesgespeichert.
- Unter Windows werden diese Module in
- Module, die mit PowerShell ausgeliefert werden, werden in
$PSHOME\Modulesgespeichert.
Anmerkung
Anwendungen, die PowerShell-Module enthalten, können Module in anderen Verzeichnissen unter Windows installieren, z. B. den Ordner Program Files. Das Installer-Paket fügt den Speicherort möglicherweise nicht an die $Env:PSModulePathan.
Die Standardspeicherorte für Windows PowerShell 5.1 unterscheiden sich von PowerShell 7.
- Module, die im bereich CurrentUser installiert sind, werden in
$HOME\Documents\WindowsPowerShell\Modulesgespeichert. - Module, die im AllUsers Bereich installiert sind, werden in
$Env:ProgramFiles\WindowsPowerShell\Modulesgespeichert. - Module, die mit Windows PowerShell ausgeliefert werden, die in
$PSHOME\Modulesgespeichert sind, was$Env:SystemRoot\System32\WindowsPowerShell\1.0\Modulesist.
PowerShell PSModulePath-Konstruktion
Der Wert von $Env:PSModulePath wird bei jedem Start von PowerShell erstellt.
Der Wert variiert je nach Version von PowerShell und wie Sie es gestartet haben.
Windows PowerShell-Start
Windows PowerShell verwendet die folgende Logik, um die PSModulePath beim Start zu erstellen:
- Wenn
PSModulePathnicht vorhanden ist, kombinieren Sie CurrentUser-, AllUsers-und die$PSHOMEModulpfade. - Wenn
PSModulePathvorhanden ist:- Wenn
PSModulePath$PSHOMEModulpfad enthält:-
Modulpfad "AllUsers" wird vor
$PSHOMEModulpfad eingefügt.
-
Modulpfad "AllUsers" wird vor
- oder:
- Verwenden Sie einfach
PSModulePathwie definiert, da der Benutzer den$PSHOMESpeicherort 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 nur diesen Wert, selbst wenn eine Variable mit Computerbereich mit demselben Namen vorhanden ist. Die Pfad- Umgebungsvariablen werden unterschiedlich behandelt.
Unter Windows wird PSModulePath ähnlich behandelt wie die Path Umgebungsvariable behandelt wird.
Path werden 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
PSModulePathUmgebungsvariablen- Wenn dies derselbe ist:
- Fügen Sie die AllUsers-
PSModulePathnach der Semantik derPATHUmgebungsvariablen an das Ende an. - Der Pfad "Windows
System32" stammt aus dem computerdefiniertenPSModulePath, 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
$PSHOMEPfaden in dieser Reihenfolge- Wenn
powershell.config.jsoneinen benutzerbezogenenPSModulePathenthält, verwenden Sie dies anstelle der Standardeinstellung für den Benutzer. - Wenn
powershell.config.jsonein systembereichsbezogenesPSModulePathenthält, 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 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
$PSHOMEModulpfad.
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 PSModulePath Umgebungsvariablen ä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 erweiterten 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)