Freigeben über


Grundlegendes zu PSModulePath

Kurze Beschreibung

In diesem Artikel werden der Zweck und die Verwendung der $env:PSModulePath Umgebungsvariablen beschrieben.

Lange Beschreibung

Die Umgebungsvariable $env:PSModulePath enthält eine Liste von Ordnerspeicherorten, die nach Modulen und Ressourcen gesucht werden. 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 folgende effektive Standorte zugewiesen $env:PSModulePath :

  • Systemweite Speicherorte: Diese Ordner enthalten Module, die im Lieferumfang von PowerShell enthalten sind. Diese Module werden im $PSHOME\Modules Ordner gespeichert.

    • Unter Windows werden module, die im Bereich AllUsers installiert sind, in $env:ProgramFiles\WindowsPowerShell\Modulesgespeichert.
    • Auf Nicht-Windows-Systemen werden Module, die im Bereich AllUsers installiert sind, in /usr/local/share/powershell/Modulesgespeichert.
  • Vom Benutzer installierte Module: Unter Windows werden module, die im CurrentUser-Bereich installiert sind, in der Regel im $HOME\Documents\WindowsPowerShell\Modules Ordner gespeichert. Der spezifische Speicherort des Ordners Documents variiert je nach Version von Windows und nach Verwendung der Ordnerumleitung. Außerdem kann Microsoft OneDrive den Speicherort Ihres Documents Ordners ändern. Sie können den Speicherort Ihres Documents Ordners mit dem folgenden Befehl überprüfen: [Environment]::GetFolderPath('MyDocuments').

    Auf Nicht-Windows-Systemen werden module, die im CurrentUser-Bereich installiert sind, im $HOME/.local/share/powershell/Modules Ordner gespeichert.

  • Anwendungsspezifische Module: Setupprogramme können Module in anderen Verzeichnissen installieren, z. B. im Program Files Ordner unter Windows. Das Installationspaket kann den Speicherort an das $env:PSModulePathanfügen oder nicht.

PowerShell PSModulePath-Konstruktion

Der Wert von wird bei jedem Start von $env:PSModulePath PowerShell erstellt. Der Wert variiert je nach Version von PowerShell und dessen Start.

Windows PowerShell Start

Windows PowerShell verwendet die folgende Logik, um die PSModulePath beim Start zu erstellen:

  • Wenn PSModulePath nicht vorhanden, kombinieren Sie CurrentUser, AllUsers und die $PSHOME Modulpfade.
  • Wenn PSModulePath vorhanden:
    • Wenn PSModulePath den Modulpfad enthält $PSHOME :
      • Der Modulpfad "AllUsers " wird vor dem $PSHOME Modulpfad eingefügt.
    • oder:
      • Verwenden Sie PSModulePath einfach wie definiert, da der Benutzer den $PSHOME Speicherort absichtlich entfernt hat.

Dem CurrentUser-Modulpfad wird nur dann das Präfix vorangestellt, wenn der Bereich $env:PSModulePath User nicht vorhanden ist. Andernfalls wird der Benutzerbereich $env:PSModulePath wie definiert verwendet.

PowerShell 7-Start

In Windows verwendet ein neuer Prozess für die meisten Umgebungsvariablen diesen Wert nur, wenn eine Variable mit demselben Namen vorhanden ist.

In PowerShell 7 PSModulePath wird ähnlich wie die Path Umgebungsvariable unter Windows behandelt. Unter Windows Path wird anders behandelt als andere Umgebungsvariablen. Wenn ein Prozess gestartet wird, kombiniert Windows den Benutzerbereich Path mit dem computerbezogenen Path.

  • Abrufen des Benutzerbereichs PSModulePath
  • Vergleichen mit einer vererbten Umgebungsvariablen PSModulePath
    • Wenn dasselbe gilt:
      • Fügen Sie die AllUsers nach der Semantik der Umgebungsvariablen PSModulePath an das Path Ende an.
      • Der Windows-Pfad System32 stammt von dem definierten PSModulePath Computer und muss daher nicht explizit hinzugefügt werden.
    • Wenn anders, behandeln Sie es so, als ob der Benutzer sie explizit geändert hätte, und fügen Sie nicht AllUsers an.PSModulePath
  • Präfix mit PS7-Benutzer, System und $PSHOME Pfaden in dieser Reihenfolge
    • Wenn powershell.config.json einen Benutzerbereich PSModulePathenthält, verwenden Sie diese anstelle der Standardeinstellung für den Benutzer.
    • Wenn powershell.config.json einen Systembereich PSModulePathenthält, verwenden Sie diese anstelle der Standardeinstellung für das System.

Unix-Systeme verfügen nicht über eine Trennung von Benutzer- und Systemumgebungsvariablen. PSModulePath wird geerbt, und die PS7-spezifischen Pfade erhalten ein Präfix, wenn sie noch nicht definiert sind.

Starten Windows PowerShell über PowerShell 7

Für diese Diskussion bedeutet Windows PowerShell sowohl als auch powershell.exepowershell_ise.exe.

Der Wert von $env:PSModulePath wird mit den folgenden Änderungen in WinPSModulePath kopiert:

  • Entfernen sie PS7, den Pfad des Benutzermoduls.
  • Entfernen von PS7: Pfad des Systemmoduls
  • Entfernen des PS7-Modulpfads $PSHOME

Die PS7-Pfade werden entfernt, sodass PS7-Module nicht in Windows PowerShell geladen werden. Der WinPSModulePath Wert wird beim Starten Windows PowerShell verwendet.

Starten von PowerShell 7 über Windows PowerShell

Der PowerShell 7-Start wird unverändert fortgesetzt, und es werden die hinzugefügten Pfade hinzugefügt, die hinzugefügt Windows PowerShell. Da den PS7-spezifischen Pfaden das Präfix vorangestellt ist, liegt kein Funktionales Problem vor.

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. 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 mit dem Parameter FullyQualifiedName . Weitere Informationen finden Sie unter Import-Module.

Ändern von PSModulePath

In den meisten Fällen sollten Sie Module an den Standardspeicherorten des Moduls installieren. Möglicherweise müssen Sie jedoch den Wert der PSModulePath Umgebungsvariablen ändern.

Um beispielsweise vorübergehend das Verzeichnis $env:PSModulePath für die C:\Program Files\Fabrikam\Modules aktuelle Sitzung hinzuzufügen, geben Sie Folgendes ein:

$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"

Das Semikolon (;) im Befehl trennt den neuen Pfad von dem Pfad, der ihm in der Liste vorangestellt ist. Auf Nicht-Windows-Plattformen trennt der Doppelpunkt (:) die Pfadspeicherorte in der Umgebungsvariablen.

Ä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 erweiterte 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 dem 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 in HKLM:\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)

Weitere Informationen