about_PSModulePath

Korte beschrijving

In dit artikel worden het doel en het gebruik van de $env:PSModulePath omgevingsvariabele beschreven.

Lange beschrijving

De $env:PSModulePath omgevingsvariabele bevat een lijst met maplocaties die worden doorzocht om modules en resources te vinden. PowerShell doorzoekt recursief elke map naar modulebestanden (.psd1 of .psm1) bestanden.

Install-Module heeft een bereikparameter waarmee u kunt opgeven of de module is geïnstalleerd voor de huidige gebruiker of voor alle gebruikers. Zie Install-Module voor meer informatie.

De effectieve locaties waaraan is toegewezen $env:PSModulePath , zijn standaard:

  • Systeembrede locaties: deze mappen bevatten modules die worden verzonden met PowerShell. Deze modules worden opgeslagen in de $PSHOME\Modules map.

    • In Windows worden modules die in het bereik AllUsers zijn geïnstalleerd, opgeslagen in $env:ProgramFiles\WindowsPowerShell\Modules.
    • Op niet-Windows-systemen worden modules die zijn geïnstalleerd in het bereik AllUsers opgeslagen in /usr/local/share/powershell/Modules.
  • Door de gebruiker geïnstalleerde modules: in Windows worden modules die zijn geïnstalleerd in het bereik CurrentUser doorgaans opgeslagen in de $HOME\Documents\WindowsPowerShell\Modules map. De specifieke locatie van de Documents map verschilt per versie van Windows en wanneer u mapomleiding gebruikt. Microsoft OneDrive kan ook de locatie van uw Documents map wijzigen. U kunt de locatie van uw Documents map controleren met behulp van de volgende opdracht: [Environment]::GetFolderPath('MyDocuments')

    Op niet-Windows-systemen worden modules die in het bereik CurrentUser zijn geïnstalleerd, opgeslagen in de $HOME/.local/share/powershell/Modules map.

  • Toepassingsspecifieke modules: Installatieprogramma's kunnen modules installeren in andere mappen, zoals de Program Files map in Windows. Het installatiepakket mag de locatie wel of niet toevoegen aan de $env:PSModulePath.

PowerShell PSModulePath-constructie

De waarde van $env:PSModulePath wordt telkens wanneer PowerShell wordt gestart, samengesteld. De waarde verschilt per versie van PowerShell en hoe deze wordt gestart.

Windows PowerShell opstarten

Windows PowerShell gebruikt de volgende logica om de PSModulePath opstartfunctie samen te stellen:

  • Als PSModulePath dit niet bestaat, combineert u CurrentUser, AllUsers en de $PSHOME modulespaden
  • Als PSModulePath dit wel bestaat:
    • Als PSModulePath dit pad naar modules bevat $PSHOME :
      • Pad naar AllUsers-modules wordt ingevoegd vóór $PSHOME het pad naar modules
    • Anders:
      • PSModulePath Gebruik gewoon zoals gedefinieerd omdat de gebruiker de locatie opzettelijk heeft verwijderd $PSHOME

Het pad van de CurrentUser-module wordt alleen voorafgegaan als het gebruikersbereik $env:PSModulePath niet bestaat. Anders wordt het gebruikersbereik $env:PSModulePath gebruikt zoals gedefinieerd.

PowerShell 7 opstarten

In Windows wordt voor de meeste omgevingsvariabelen, als de variabele met gebruikersbereik bestaat, deze waarde alleen gebruikt, zelfs als er een variabele met machinebereik van dezelfde naam bestaat.

In PowerShell 7 PSModulePath wordt behandeld zoals de Path omgevingsvariabele wordt behandeld in Windows. In Windows Path wordt anders behandeld dan andere omgevingsvariabelen. Wanneer een proces wordt gestart, combineert Windows het gebruikersbereik Path met het machinebereik Path.

  • Het bereik van de gebruiker ophalen PSModulePath
  • Vergelijken met het proces van de overgenomen omgevingsvariabele PSModulePath
    • Als hetzelfde geldt:
      • Voeg de AllUsersPSModulePath toe aan het einde na de semantiek van de Path omgevingsvariabele
      • Het Windows-pad System32 is afkomstig van de gedefinieerde PSModulePath computer, dus hoeft niet expliciet te worden toegevoegd
    • Als dit anders is, behandelt u alsof de gebruiker deze expliciet heeft gewijzigd en geen AllUsers toevoegt PSModulePath
  • Voorvoegsel met PS7 User, System en $PSHOME paden in die volgorde
    • Als powershell.config.json dit een gebruikerbereik PSModulePathbevat, gebruikt u deze in plaats van de standaardwaarde voor de gebruiker
    • Als powershell.config.json dit een systeembereik PSModulePathbevat, gebruikt u dat in plaats van de standaardwaarde voor het systeem

Unix-systemen hebben geen scheiding van omgevingsvariabelen voor gebruikers en systemen. PSModulePath wordt overgenomen en de PS7-specifieke paden worden voorafgegaan als deze nog niet zijn gedefinieerd.

Windows PowerShell starten vanuit PowerShell 7

Voor deze discussie betekent Windows PowerShell zowel als powershell.exepowershell_ise.exe.

De waarde wordt $env:PSModulePath gekopieerd naar WinPSModulePath met de volgende wijzigingen:

  • Ps7 het pad naar de gebruikersmodule verwijderen
  • Ps7 het pad naar de systeemmodule verwijderen
  • PS7 het $PSHOME modulepad verwijderen

De PS7-paden worden verwijderd, zodat PS7-modules niet worden geladen in Windows PowerShell. De WinPSModulePath waarde wordt gebruikt bij het starten van Windows PowerShell.

PowerShell 7 starten vanuit Windows PowerShell

Het opstarten van PowerShell 7 gaat verder met het toevoegen van overnamepaden die door Windows PowerShell zijn toegevoegd. Omdat de PS7-specifieke paden worden voorafgegaan, is er geen functioneel probleem.

Zoekgedrag van module

PowerShell doorzoekt recursief elke map in de PSModulePath naar modulebestanden (.psd1 of .psm1) bestanden. Met dit zoekpatroon kunnen meerdere versies van dezelfde module in verschillende mappen worden geïnstalleerd. Voorbeeld:

    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

PowerShell laadt standaard het hoogste versienummer van een module wanneer er meerdere versies worden gevonden. Als u een specifieke versie wilt laden, gebruikt Import-Module u deze met de parameter FullyQualifiedName . Zie Import-Module voor meer informatie.

PSModulePath wijzigen

In de meeste gevallen moet u modules installeren op de standaardmodulelocaties. Het is echter mogelijk dat u de waarde van de PSModulePath omgevingsvariabele moet wijzigen.

Als u bijvoorbeeld tijdelijk de C:\Program Files\Fabrikam\Modules map wilt toevoegen aan $env:PSModulePath de huidige sessie, typt u:

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

De puntkomma (;) in de opdracht scheidt het nieuwe pad van het pad dat eraan voorafgaat in de lijst. Op niet-Windows-platforms scheidt de dubbele punt (:) de padlocaties in de omgevingsvariabele.

PSModulePath wijzigen in niet-Windows

Als u de waarde van PSModulePath elke sessie in een niet-Windows-omgeving wilt wijzigen, voegt u de vorige opdracht toe aan uw PowerShell-profiel.

PSModulePath wijzigen in Windows

Als u de waarde van PSModulePath elke sessie wilt wijzigen, bewerkt u de registersleutel die de PSModulePath waarden opslaat. De PSModulePath waarden worden in het register opgeslagen als niet-uitgevouwen tekenreeksen. Als u wilt voorkomen dat de PSModulePath waarden permanent worden opgeslagen als uitgebreide tekenreeksen, gebruikt u de Methode GetValue op de subsleutel en bewerkt u de waarde rechtstreeks.

In het volgende voorbeeld wordt het C:\Program Files\Fabrikam\Modules pad toegevoegd aan de waarde van de PSModulePath omgevingsvariabele zonder de niet-uitgevouwen tekenreeksen uit te vouwen.

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

Als u een pad naar de gebruikersinstelling wilt toevoegen, wijzigt u de registerprovider van 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)

Zie ook