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 $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 zugewiesenen effektiven Speicherorte für $env:PSModulePath:
Systemweite Speicherorte: Diese Ordner enthalten Module, die im Lieferumfang von PowerShell enthalten sind. Diese Module werden in dem
$PSHOME\ModulesOrdner abgelegt.- Unter Windows werden Module, die im AllUsers-Bereich installiert sind, in
$env:ProgramFiles\WindowsPowerShell\Modulesgespeichert. - Auf Nicht-Windows-Systemen werden Module, die im AllUsers-Bereich installiert sind, in
/usr/local/share/powershell/Modules.
- Unter Windows werden Module, die im AllUsers-Bereich installiert sind, in
Vom Benutzer installierte Module: Unter Windows werden Module, die im CurrentUser-Bereich installiert sind, in der Regel in dem
$HOME\Documents\WindowsPowerShell\ModulesOrdner gespeichert. Der spezifische Speicherort des ordnersDocumentsvariiert je nach Windows-Version und beim Verwenden der Ordnerumleitung. Außerdem kann Microsoft OneDrive den Speicherort IhresDocumentsOrdners ändern. Sie können den Speicherort desDocumentsOrdners mit dem folgenden Befehl überprüfen:[Environment]::GetFolderPath('MyDocuments').Auf Nicht-Windows-Systemen werden Module, die im CurrentUser-Bereich installiert sind, in dem
$HOME/.local/share/powershell/ModulesOrdner gespeichert.Anwendungsspezifische Module: Setup-Programme können Module in anderen Verzeichnissen installieren, z. B. im
Program FilesOrdner unter Windows. Das Installationspaket kann den Speicherort an die$env:PSModulePath.
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
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 diesen Wert nur, wenn eine Variable mit Computerbereich mit demselben Namen vorhanden ist.
In PowerShell 7 PSModulePath wird ähnlich behandelt wie die Path Umgebungsvariable unter Windows. Unter Windows Path wird 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 Windows-Pfad
System32stammt von dem definiertenPSModulePathComputer und muss daher nicht explizit hinzugefügt werden
- 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
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
$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 zu vermeiden, dass die PSModulePath Werte dauerhaft als erweiterte Zeichenfolgen gespeichert werden, 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 addiert, 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)
Wenn Sie der Benutzereinstellung einen Pfad hinzufügen möchten, ä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)