about_PSModulePath
Kort beskrivning
I den här artikeln beskrivs syftet med och användningen av miljövariabeln $env:PSModulePath
.
Lång beskrivning
Miljövariabeln $env:PSModulePath
innehåller en lista över mappplatser som söks efter moduler och resurser. PowerShell söker rekursivt igenom varje mapp efter modulfiler (.psd1
eller .psm1
).
Install-Module
har parametern Scope som gör att du kan ange om modulen är installerad för den aktuella användaren eller för alla användare. Mer information finns i Install-Module.
Som standard är de effektiva platser som tilldelats $env:PSModulePath
:
systemomfattande platser: Dessa mappar innehåller moduler som levereras med PowerShell. Dessa moduler lagras i mappen
$PSHOME\Modules
.- I Windows lagras moduler som är installerade i omfånget Allaanvändare i
$env:ProgramFiles\WindowsPowerShell\Modules
. - På icke-Windows-system lagras moduler som är installerade i AllUsers-omfånget i
/usr/local/share/powershell/Modules
.
- I Windows lagras moduler som är installerade i omfånget Allaanvändare i
Användarinstallerade moduler: I Windows lagras moduler som är installerade i CurrentUser--omfånget vanligtvis i mappen
$HOME\Documents\WindowsPowerShell\Modules
. Den specifika platsen för mappenDocuments
varierar beroende på version av Windows och när du använder mappomdirigering. Dessutom kan Microsoft OneDrive ändra platsen för dinDocuments
mapp. Du kan kontrollera platsen för mappenDocuments
med hjälp av följande kommando:[Environment]::GetFolderPath('MyDocuments')
.I andra system än Windows lagras moduler som är installerade i CurrentUser--omfånget i mappen
$HOME/.local/share/powershell/Modules
.Programspecifika moduler: Installationsprogram kan installera moduler i andra kataloger, till exempel mappen
Program Files
i Windows. Installationspaketet kanske eller kanske inte lägger till platsen i$env:PSModulePath
.
PowerShell PSModulePath-konstruktion
Värdet för $env:PSModulePath
konstrueras varje gång PowerShell startar.
Värdet varierar beroende på version av PowerShell och hur det startas.
Windows PowerShell-start
Windows PowerShell använder följande logik för att skapa PSModulePath
vid start:
- Om
PSModulePath
inte finns kan du kombinera CurrentUser, AllUsersoch sökvägarna för$PSHOME
-moduler - Om
PSModulePath
finns:- Om
PSModulePath
innehåller sökvägen$PSHOME
moduler:- sökvägen Allaanvändare moduler infogas innan
$PSHOME
modulsökväg
- sökvägen Allaanvändare moduler infogas innan
- annars:
- Använd bara
PSModulePath
som definierat eftersom användaren avsiktligt tog bort$PSHOME
plats
- Använd bara
- Om
Modulsökvägen CurrentUser prefixet endast om användaromfånget $env:PSModulePath
inte finns. Annars används användaromfånget $env:PSModulePath
enligt definitionen.
PowerShell 7-start
För de flesta miljövariabler i Windows, om variabeln Med användaromfattning finns, använder en ny process endast det värdet även om det finns en variabel med datoromfattning med samma namn.
I PowerShell 7 behandlas PSModulePath
på samma sätt som den Path
miljövariabeln behandlas i Windows. I Windows behandlas Path
annorlunda än andra miljövariabler. När en process startas kombinerar Windows den användaromfattande Path
med den datoromfångade Path
.
- Hämta
PSModulePath
med användaromfattning - Jämför med processärvd
PSModulePath
miljövariabel- Om samma sak gäller:
- Lägg till Allaanvändare
PSModulePath
till slutet efter semantiken iPath
miljövariabeln - Sökvägen för Windows
System32
kommer från den dator som definieratsPSModulePath
så behöver inte läggas till explicit
- Lägg till Allaanvändare
- Om det är annorlunda kan du behandla som om användaren uttryckligen ändrade det och inte lägger till Allaanvändare
PSModulePath
- Om samma sak gäller:
- Prefix med PS7-användare, system och
$PSHOME
sökvägar i den ordningen- Om
powershell.config.json
innehåller ett användaromfångPSModulePath
använder du det i stället för standardvärdet för användaren - Om
powershell.config.json
innehåller en systemomfattningPSModulePath
använder du den i stället för standardinställningen för systemet
- Om
Unix-system har inte någon uppdelning av miljövariabler för användare och system.
PSModulePath
ärvs och ps7-specifika sökvägar prefix om de inte redan har definierats.
Starta Windows PowerShell från PowerShell 7
För den här diskussionen innebär Windows PowerShell både powershell.exe
och powershell_ise.exe
.
Värdet för $env:PSModulePath
kopieras till WinPSModulePath
med följande ändringar:
- Ta bort PS7-modulsökvägen för användarmodulen
- Ta bort PS7-modulsökvägen
- Ta bort ps7-modulsökvägen
$PSHOME
PS7-sökvägarna tas bort så att PS7-moduler inte läses in i Windows PowerShell. Värdet WinPSModulePath
används när Windows PowerShell startas.
Starta PowerShell 7 från Windows PowerShell
PowerShell 7-starten fortsätter as-is med tillägg av ärvande sökvägar som Windows PowerShell har lagt till. Eftersom de PS7-specifika sökvägarna är prefix finns det inget funktionellt problem.
Beteende för modulsökning
PowerShell söker rekursivt igenom varje mapp i PSModulePath- efter modulfiler (.psd1
eller .psm1
). Med det här sökmönstret kan flera versioner av samma modul installeras i olika mappar. Till exempel:
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
Som standard läser PowerShell in det högsta versionsnumret för en modul när flera versioner hittas. Om du vill läsa in en viss version använder du Import-Module
med parametern FullyQualifiedName. Mer information finns i Import-Module.
Ändra PSModulePath
I de flesta fall bör du installera moduler på standardmodulplatserna. Du kan dock behöva ändra värdet för PSModulePath
miljövariabeln.
Om du till exempel tillfälligt vill lägga till katalogen C:\Program Files\Fabrikam\Modules
i $env:PSModulePath
för den aktuella sessionen skriver du:
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
Semikolonet (;
) i kommandot separerar den nya sökvägen från sökvägen som föregår den i listan. På icke-Windows-plattformar separerar kolonet (:
) sökvägsplatserna i miljövariabeln.
Ändra PSModulePath i icke-Windows
Om du vill ändra värdet för PSModulePath
för varje session i en icke-Windows-miljö lägger du till det tidigare kommandot i din PowerShell-profil.
Ändra PSModulePath i Windows
Om du vill ändra värdet för PSModulePath
i varje session redigerar du registernyckeln som lagrar PSModulePath
värden. De PSModulePath
värdena lagras i registret som oexpanderade strängar. Om du vill undvika att permanent spara PSModulePath
värden när expanderade strängar använder du metoden GetValue i undernyckeln och redigerar värdet direkt.
I följande exempel läggs den C:\Program Files\Fabrikam\Modules
sökvägen till värdet för PSModulePath
miljövariabeln utan att expandera de icke-expanderade strängarna.
$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)
Om du vill lägga till en sökväg till användarinställningen ändrar du registerprovidern från HKLM:\
till 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)