Freigeben über


Grundlegendes zu PSModulePath

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

Standardmäßig sind die folgenden effektiven Speicherorte zugewiesen $env:PSModulePath :

  • Systemweite Speicherorte: Diese Ordner enthalten Module, die mit PowerShell ausgeliefert werden. Diese Module werden im $PSHOME\Modules Ordner gespeichert. Dies ist auch der Speicherort, an dem die Windows-Verwaltungsmodule installiert werden.

  • Vom Benutzer installierte Module: Hierbei handelt es sich um vom Benutzer installierte Module. 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.

    • Unter Windows ist der Speicherort des benutzerspezifischen CurrentUser-Bereichs der $HOME\Documents\PowerShell\Modules Ordner. Der Speicherort des AllUsers-Bereichs ist $env:ProgramFiles\PowerShell\Modules.
    • Auf Nicht-Windows-Systemen ist der Speicherort des benutzerspezifischen CurrentUser-Bereichs der $HOME/.local/share/powershell/Modules Ordner. Der Speicherort des AllUsers-Bereichs ist /usr/local/share/powershell/Modules.

Darüber hinaus können Setupprogramme, die Module in anderen Verzeichnissen installieren, z. B. das Verzeichnis Programme, ihre Speicherorte an den Wert von $env:PSModulePathanfügen.

Hinweis

Unter Windows ist der benutzerspezifische Speicherort der PowerShell\Modules Ordner im Ordner Dokumente in Ihrem Benutzerprofil. Der spezifische Pfad dieses Speicherorts variiert je nach Version von Windows und ob Sie die Ordnerumleitung verwenden oder nicht. Microsoft OneDrive kann auch den Speicherort Ihres Ordners "Dokumente" ändern. Sie können den Speicherort Ihres Ordners Dokumente mit dem folgenden Befehl überprüfen: [Environment]::GetFolderPath('MyDocuments').

PowerShell PSModulePath-Konstruktion

Der Wert von $env:PSModulePath wird jedes Mal erstellt, wenn PowerShell gestartet wird. Der Wert variiert je nach Version von PowerShell und dessen Start.

Windows PowerShell Start

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

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

Der CurrentUser-Modulpfad wird nur präfixiert, wenn der Benutzerbereich $env:PSModulePath 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 nur dann diesen Wert, wenn eine Variable im Bereich Computer mit demselben Namen vorhanden ist.

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

  • Abrufen des Benutzerbereichs PSModulePath
  • Vergleich mit geerbter PSModulePath Umgebungsvariable
    • 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 sie so, als ob der Benutzer sie explizit geändert hat, und fügen Sie keine AllUsers an.PSModulePath
  • Präfix mit PS7-Benutzer, System und $PSHOME Pfaden in dieser Reihenfolge
    • Wenn powershell.config.json ein Benutzerbereich enthalten ist PSModulePath, verwenden Sie diesen anstelle des Standardwerts für den Benutzer.
    • Wenn powershell.config.json ein Systembereich enthält PSModulePath, verwenden Sie diesen anstelle des Standardwerts für das System.

Unix-Systeme verfügen nicht über eine Trennung von Benutzer- und Systemumgebungsvariablen. PSModulePath wird geerbt, und die PS7-spezifischen Pfade werden vorangestellt, 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 des PS7-Modulpfads "Benutzer"
  • Entfernen von PS7 den 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 mit dem Hinzufügen von erblichen Pfaden fortgesetzt, 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 Standardmodulspeicherorten installieren. Möglicherweise müssen Sie jedoch den Wert der PSModulePath Umgebungsvariable ändern.

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

$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 Pfadpositionen 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 für jede Sitzung in einer Windows-Umgebung 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 += ';C:\Program Files\Fabrikam\Modules' # or '%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:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';C:\Program Files\Fabrikam\Modules' # or '%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Weitere Informationen