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. PowerShell doorzoekt recursief elke map naar modulebestanden (.psd1
of .psm1
) bestanden.
De effectieve locaties waaraan is toegewezen $env:PSModulePath
, zijn standaard:
- Modules die zijn geïnstalleerd in het bereik CurrentUser :
- In Windows worden deze modules opgeslagen in
$HOME\Documents\PowerShell\Modules
. De specifieke locatie van deDocuments
map verschilt per versie van Windows en wanneer u mapomleiding gebruikt. Microsoft OneDrive kan ook de locatie van uwDocuments
map wijzigen. Voer de volgende opdracht uit om de locatie van uwDocuments
map te controleren:[Environment]::GetFolderPath('MyDocuments')
- Op niet-Windows-systemen worden deze modules opgeslagen in de
$HOME/.local/share/powershell/Modules
map.
- In Windows worden deze modules opgeslagen in
- Modules die zijn geïnstalleerd in het bereik AllUsers :
- In Windows worden deze modules opgeslagen in
$env:ProgramFiles\PowerShell\Modules
. - Op niet-Windows-systemen worden deze modules opgeslagen in
/usr/local/share/powershell/Modules
.
- In Windows worden deze modules opgeslagen in
- Modules die worden verzonden met PowerShell, worden opgeslagen in
$PSHOME\Modules
.
Notitie
Toepassingen met PowerShell-modules kunnen modules installeren in andere mappen in Windows, zoals de Program Files
map. Het installatiepakket voegt mogelijk de locatie niet toe aan de $env:PSModulePath
.
De standaardlocaties voor Windows PowerShell 5.1 verschillen van PowerShell 7.
- Modules die zijn geïnstalleerd in het bereik CurrentUser , worden opgeslagen in
$HOME\Documents\WindowsPowerShell\Modules
. - Modules die zijn geïnstalleerd in het bereik AllUsers , worden opgeslagen in
$env:ProgramFiles\WindowsPowerShell\Modules
. - Modules die worden verzonden met Windows PowerShell die zijn opgeslagen in
$PSHOME\Modules
, dat wil$env:SystemRoot\System32\WindowsPowerShell\1.0\Modules
wel .
PowerShell PSModulePath-constructie
De waarde van $env:PSModulePath
wordt telkens wanneer PowerShell wordt gestart, samengesteld.
De waarde verschilt per versie van PowerShell en hoe u deze hebt 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
- Pad naar AllUsers-modules wordt ingevoegd vóór
- anders:
PSModulePath
Gebruik gewoon zoals gedefinieerd omdat de gebruiker de locatie opzettelijk heeft verwijderd$PSHOME
- Als
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, alleen die waarde gebruikt, zelfs wanneer er een variabele met machinebereik van dezelfde naam bestaat. De omgevingsvariabelen van het pad worden anders behandeld.
In Windows PSModulePath
wordt deze vergelijkbaar behandeld met de manier waarop de Path
omgevingsvariabele wordt behandeld. 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 AllUsers
PSModulePath
toe aan het einde na de semantiek van dePath
omgevingsvariabele - Het Windows-pad
System32
is afkomstig van de gedefinieerdePSModulePath
computer, dus hoeft niet expliciet te worden toegevoegd
- Voeg de AllUsers
- Als dit anders is, behandelt u alsof de gebruiker deze expliciet heeft gewijzigd en geen AllUsers toevoegt
PSModulePath
- Als hetzelfde geldt:
- Voorvoegsel met PS7 User, System en
$PSHOME
paden in die volgorde- Als
powershell.config.json
dit een gebruikerbereikPSModulePath
bevat, gebruikt u deze in plaats van de standaardwaarde voor de gebruiker - Als
powershell.config.json
dit een systeembereikPSModulePath
bevat, gebruikt u dat in plaats van de standaardwaarde voor het systeem
- Als
Niet-Windows-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.exe
powershell_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. 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
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 GetValue()
methode 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\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)
Gebruik de volgende code om een pad naar de gebruikersinstelling toe te voegen:
$key = (Get-Item 'HKCU:\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)