about_PSModulePath
De $env:PSModulePath
omgevingsvariabele bevat een lijst met maplocaties die worden doorzocht om modules en resources te vinden. PowerShell doorzoekt elke map recursief naar modulebestanden (.psd1
of .psm1
).
Standaard zijn de effectieve locaties die zijn toegewezen aan $env:PSModulePath
:
Systeembrede locaties: deze mappen bevatten modules die worden geleverd met PowerShell. Deze modules worden opgeslagen in de
$PSHOME\Modules
map. Dit is ook de locatie waar de Windows-beheermodules zijn geïnstalleerd.Door de gebruiker geïnstalleerde modules: dit zijn modules die door de gebruiker zijn geïnstalleerd.
Install-Module
heeft een bereikparameter waarmee u kunt opgeven of de module moet worden geïnstalleerd voor de huidige gebruiker of voor alle gebruikers. Zie Install-Module voor meer informatie.- In Windows is de locatie van het gebruikersspecifieke CurrentUser-bereik de
$HOME\Documents\PowerShell\Modules
map. De locatie van het bereik AllUsers is$env:ProgramFiles\PowerShell\Modules
. - Op niet-Windows-systemen is de locatie van het gebruikersspecifieke CurrentUser-bereik de
$HOME/.local/share/powershell/Modules
map. De locatie van het bereik AllUsers is/usr/local/share/powershell/Modules
.
- In Windows is de locatie van het gebruikersspecifieke CurrentUser-bereik de
Bovendien kunnen installatieprogramma's die modules installeren in andere mappen, zoals de map Program Files, hun locaties toevoegen aan de waarde van $env:PSModulePath
.
Notitie
In Windows is de gebruikersspecifieke locatie de PowerShell\Modules
map in de map Documenten in uw gebruikersprofiel. Het specifieke pad van die locatie verschilt per versie van Windows en of u mapomleiding gebruikt of niet. Microsoft OneDrive kan ook de locatie van de map Documenten wijzigen. U kunt de locatie van de map Documenten controleren met behulp van de volgende opdracht: [Environment]::GetFolderPath('MyDocuments')
.
PowerShell PSModulePath-constructie
De waarde van $env:PSModulePath
wordt telkens samengesteld wanneer PowerShell wordt gestart.
De waarde verschilt per versie van PowerShell en hoe deze wordt gestart.
Windows PowerShell opstarten
Windows PowerShell gebruikt de volgende logica om de bij het PSModulePath
opstarten te maken:
- Als
PSModulePath
deze niet bestaat, combineert u de paden CurrentUser, AllUsers en de$PSHOME
modules - Als
PSModulePath
bestaat:- Als
PSModulePath
het pad naar modules bevat$PSHOME
:- Pad naar AllUsers-modules wordt ingevoegd vóór
$PSHOME
het pad naar modules
- Pad naar AllUsers-modules wordt ingevoegd vóór
- Anders:
- Gewoon gebruiken
PSModulePath
zoals gedefinieerd omdat de gebruiker de$PSHOME
locatie opzettelijk heeft verwijderd
- Gewoon gebruiken
- Als
Het pad naar de CurrentUser-module wordt alleen voorafgegaan als 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 gebruikersbereik bestaat, deze waarde alleen gebruikt door een nieuw proces, zelfs als er een variabele met machinebereik met dezelfde naam bestaat.
In PowerShell 7 PSModulePath
wordt behandeld op dezelfde manier als de Path
omgevingsvariabele 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 gebruikersbereik ophalen
PSModulePath
- Vergelijken met overgenomen omgevingsvariabele
PSModulePath
- Indien hetzelfde:
- Voeg de AllUsers
PSModulePath
toe aan het einde volgens de semantiek van dePath
omgevingsvariabele - Het Windows-pad
System32
is afkomstig van de computer die is gedefinieerdPSModulePath
en hoeft dus niet expliciet te worden toegevoegd
- Voeg de AllUsers
- Als dit verschilt, behandelt u het alsof de gebruiker dit expliciet heeft gewijzigd en voegt u geen AllUsers toe
PSModulePath
- Indien hetzelfde:
- Voorvoegsel met PS7-gebruiker, -systeem en
$PSHOME
-paden in die volgorde- Als
powershell.config.json
het gebruikersbereikPSModulePath
bevat, gebruikt u dat in plaats van de standaardinstelling voor de gebruiker - Als
powershell.config.json
een systeembereikPSModulePath
bevat, gebruikt u dat in plaats van de standaardinstelling voor het systeem
- Als
Unix-systemen hebben geen scheiding tussen gebruikers- en systeemomgevingsvariabelen.
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 powershell_ise.exe
als powershell.exe
.
De waarde van $env:PSModulePath
wordt gekopieerd naar WinPSModulePath
met de volgende wijzigingen:
- PS7 het pad naar de gebruikersmodule verwijderen
- Ps7 het pad van de systeemmodule verwijderen
- Ps7 het
$PSHOME
modulepad verwijderen
De PS7-paden worden verwijderd, zodat PS7-modules niet in Windows PowerShell worden geladen. De WinPSModulePath
waarde wordt gebruikt bij het starten van Windows PowerShell.
PowerShell 7 starten vanaf Windows PowerShell
Het opstarten van PowerShell 7 gaat gewoon door met de toevoeging van overnamepaden die Windows PowerShell toegevoegd. Omdat de PS7-specifieke paden een voorvoegsel hebben, is er geen functioneel probleem.
Zoekgedrag voor modules
PowerShell doorzoekt recursief elke map in de PSModulePath naar modulebestanden (.psd1
of .psm1
) . Met dit zoekpatroon kunnen meerdere versies van dezelfde module in verschillende mappen worden geïnstalleerd. Bijvoorbeeld:
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
Standaard laadt PowerShell het hoogste versienummer van een module wanneer er meerdere versies worden gevonden. Als u een specifieke versie wilt laden, gebruikt u Import-Module
met de parameter FullyQualifiedName . Zie Import-Module voor meer informatie.
PSModulePath wijzigen
In de meeste gevallen moet u modules installeren op de standaardmodulelocaties. Mogelijk moet u echter de waarde van de PSModulePath
omgevingsvariabele wijzigen.
Als u bijvoorbeeld tijdelijk de C:\Program Files\Fabrikam\Modules
map wilt toevoegen aan $env:PSModulePath
voor 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
wilt wijzigen voor elke sessie in een niet-Windows-omgeving, voegt u de vorige opdracht toe aan uw PowerShell-profiel.
PSModulePath wijzigen in Windows
Als u de waarde van PSModulePath
wilt wijzigen voor elke sessie in een Windows-omgeving, bewerkt u de registersleutel waarin de PSModulePath
waarden worden opgeslagen. 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 breiden.
$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)
Als u een pad naar de gebruikersinstelling wilt toevoegen, wijzigt u de registerprovider van HKLM:\
in 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)