Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Korte beschrijving
In dit artikel worden het doel en het gebruik van de omgevingsvariabele $Env:PSModulePath beschreven.
Lange beschrijving
De omgevingsvariabele $Env:PSModulePath bevat een lijst met maplocaties. PowerShell doorzoekt recursief elke map naar modulebestanden (.psd1 of .psm1).
De effectieve locaties die zijn toegewezen aan $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 de mapDocumentsverschilt per versie van Windows en wanneer u mapomleiding gebruikt. Microsoft OneDrive kan ook de locatie van uwDocumentsmap wijzigen. Voer de volgende opdracht uit om de locatie van uwDocumentsmap te controleren:[Environment]::GetFolderPath('MyDocuments'). - Op niet-Windows-systemen worden deze modules opgeslagen in de map
$HOME/.local/share/powershell/Modules.
- 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 in andere mappen in Windows installeren, zoals de map Program Files. Het installatiepakket kan de locatie mogelijk niet toevoegen 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, wat$Env:SystemRoot\System32\WindowsPowerShell\1.0\Modulesis.
PowerShell PSModulePath-constructie
De waarde van $Env:PSModulePath wordt telkens samengesteld wanneer PowerShell wordt gestart.
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 bij het opstarten samen te stellen:
- Als
PSModulePathniet bestaat, combineert u CurrentUser, AllUsersen de$PSHOME-modulespaden - Als
PSModulePathbestaat:- Als
PSModulePathhet pad naar$PSHOMEmodules bevat:-
Pad naar alle gebruikers modules wordt ingevoegd voordat het pad naar
$PSHOMEmodules wordt ingevoegd
-
Pad naar alle gebruikers modules wordt ingevoegd voordat het pad naar
- anders:
- Gebruik
PSModulePathzoals gedefinieerd omdat de gebruiker de$PSHOMElocatie opzettelijk heeft verwijderd
- Gebruik
- Als
Het CurrentUser modulepad 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. Het pad omgevingsvariabelen worden anders behandeld.
In Windows wordt PSModulePath behandeld zoals de Path omgevingsvariabele wordt behandeld.
Path wordt anders behandeld dan andere omgevingsvariabelen. Wanneer een proces wordt gestart, combineert Windows de Path met het apparaatbereik Path.
- De
PSModulePathmet gebruikersbereik ophalen - Vergelijken met het proces overgenomen
PSModulePathomgevingsvariabele- Als hetzelfde geldt:
- Voeg de AllUsers-
PSModulePathtoe aan het einde na de semantiek van de omgevingsvariabelePATH - Het Windows
System32-pad is afkomstig van de door de machine gedefinieerdePSModulePathdus hoeft niet expliciet te worden toegevoegd
- Voeg de AllUsers-
- Als dit anders is, behandelt u of de gebruiker deze expliciet heeft gewijzigd en voegt u AllUsers niet toe
PSModulePath
- Als hetzelfde geldt:
- Voorvoegsel met ps7-gebruikers-, systeem- en
$PSHOMEpaden in die volgorde- Als
powershell.config.jsoneen gebruikersbereikPSModulePathbevat, gebruikt u deze in plaats van de standaardwaarde voor de gebruiker - Als
powershell.config.jsoneen systeembereikPSModulePathbevat, gebruikt u dat in plaats van de standaardinstelling 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 powershell.exe als powershell_ise.exe.
De waarde van $Env:PSModulePath wordt gekopieerd naar WinPSModulePath met de volgende wijzigingen:
- Ps7 het pad naar de gebruikersmodule verwijderen
- Ps7 het pad naar de systeemmodule verwijderen
- Ps7 verwijderen van het
$PSHOMEmodulepad
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 wordt voortgezet as-is met toevoeging van overgenomen paden 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). 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
PowerShell laadt standaard 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-Modulevoor meer informatie.
PSModulePath wijzigen
In de meeste gevallen moet u modules installeren op de standaardmodulelocaties. Mogelijk moet u echter de waarde van de omgevingsvariabele PSModulePath wijzigen.
Als u bijvoorbeeld tijdelijk de map C:\Program Files\Fabrikam\Modules 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 voor 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 in elke sessie wilt wijzigen, 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 omgevingsvariabele PSModulePath 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)