about_PSModulePath
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) .
Standaard zijn de effectieve locaties waaraan is $env:PSModulePath toegewezen:
Locaties voor het hele systeem: deze mappen bevatten modules die worden verzonden met PowerShell. Deze modules worden opgeslagen in de
$PSHOME\Modulesmap. 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-Moduleheeft 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.- In Windows is de locatie van het gebruikersspecifieke CurrentUser-bereik de
$HOME\Documents\PowerShell\Modulesmap. 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/Modulesmap. 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 varieert per versie van Windows en of u mapomleiding gebruikt. 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 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 bij het opstarten de PSModulePath volgende logica te maken:
- Als
PSModulePathdit niet bestaat, combineert u CurrentUser, AllUsers en de$PSHOMEmodulespaden - Als
PSModulePathdit wel het geval is:- Als
PSModulePathhet pad naar modules bevat$PSHOME:- Pad naar AllUsers-modules wordt ingevoegd vóór
$PSHOMEhet pad naar modules
- Pad naar AllUsers-modules wordt ingevoegd vóór
- anders:
- Gewoon gebruiken
PSModulePathzoals gedefinieerd omdat de gebruiker de$PSHOMElocatie opzettelijk heeft verwijderd
- Gewoon gebruiken
- Als
Het pad naar 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 deze 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 gebruikersbereik ophalen
PSModulePath - Vergelijken met proces-overgenomen omgevingsvariabele
PSModulePath- Als dit hetzelfde is:
- Voeg de AllUsers
PSModulePathtoe aan het einde na de semantiek van dePathomgevingsvariabele - Het Windows-pad
System32is afkomstig van de gedefinieerdePSModulePathcomputer, dus hoeft niet expliciet te worden toegevoegd
- Voeg de AllUsers
- Als dit anders is, behandelt u alsof de gebruiker deze expliciet heeft gewijzigd en voegt u geen AllUsers toe
PSModulePath
- Als dit hetzelfde is:
- Voorvoegsel met PS7-gebruiker, systeem en
$PSHOMEpaden in die volgorde- Als
powershell.config.jsondit een gebruikersbereikPSModulePathbevat, gebruikt u dit in plaats van de standaardwaarde voor de gebruiker - Als
powershell.config.jsoneen systeembereikPSModulePathbevat, gebruikt u dat in plaats van de standaardwaarde voor het systeem
- Als
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 powershell.exe als powershell_ise.exe.
De waarde van $env:PSModulePath het bestand wordt gekopieerd naar WinPSModulePath 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 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 het toevoegen van overgenomen paden die Windows PowerShell toegevoegd. Omdat de PS7-specifieke paden worden voorafgegaan, is er geen functioneel probleem.
Zoekgedrag van module
PowerShell doorzoekt recursief elke map in het PSModulePath voor modulebestanden (.psd1 of .psm1) bestanden. 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 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 in een Windows-omgeving 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 += ';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)