Freigeben über


about_PSModulePath

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 ordners Documents variiert je nach Windows-Version und beim Verwenden der Ordnerumleitung. Außerdem kann Microsoft OneDrive den Speicherort Ihres Documents Ordners ändern. Um den Speicherort Des Documents Ordners 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/Modules gespeichert.
  • 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.
  • 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 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.
    • oder:
      • Verwenden Sie einfach PSModulePath wie definiert, da der Benutzer den $PSHOME Speicherort absichtlich entfernt hat.

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 PSModulePath Umgebungsvariablen
    • Wenn dies derselbe ist:
      • Fügen Sie die AllUsers-PSModulePath nach der Semantik der PATH Umgebungsvariablen an das Ende an.
      • Der Pfad "Windows System32" stammt aus dem computerdefinierten PSModulePath, sodass er nicht explizit hinzugefügt werden muss.
    • Wenn anders, behandeln Sie es, als ob der Benutzer sie explizit geändert hat, und fügen Sie nicht AllUsersPSModulePath
  • Präfix mit PS7-Benutzer-, System- und $PSHOME Pfaden in dieser Reihenfolge
    • Wenn powershell.config.json einen benutzerbezogenen PSModulePathenthält, verwenden Sie dies anstelle der Standardeinstellung für den Benutzer.
    • Wenn powershell.config.json ein systembereichsbezogenes PSModulePathenthält, verwenden Sie dies anstelle der Standardeinstellung für das System.

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 $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 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)

Siehe auch