about_PSModulePath
Miljövariabeln $env:PSModulePath innehåller en lista över mappplatser som söks efter moduler och resurser. PowerShell söker rekursivt i varje mapp efter modulfiler (.psd1 eller .psm1).
Som standard är de effektiva platser som tilldelats:$env:PSModulePath
Systemomfattande platser: Dessa mappar innehåller moduler som levereras med PowerShell. De här modulerna lagras i
$PSHOME\Modulesmappen . Det här är också den plats där Windows-hanteringsmodulerna är installerade.Användarinstallerade moduler: Det här är moduler som installeras av användaren.
Install-Modulehar en omfångsparameter 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(Installera-modul).- I Windows är platsen för det användarspecifika CurrentUser-omfånget
$HOME\Documents\PowerShell\Modulesmappen. Platsen för AllUsers-omfånget är$env:ProgramFiles\PowerShell\Modules. - I icke-Windows-system är platsen för det användarspecifika CurrentUser-omfånget
$HOME/.local/share/powershell/Modulesmappen. Platsen för AllUsers-omfånget är/usr/local/share/powershell/Modules.
- I Windows är platsen för det användarspecifika CurrentUser-omfånget
Dessutom kan installationsprogram som installerar moduler i andra kataloger, till exempel katalogen Programfiler, lägga till sina platser till värdet $env:PSModulePathför .
Anteckning
I Windows är den användarspecifika platsen mappen PowerShell\Modules som finns i mappen Dokument i din användarprofil. Den specifika sökvägen för den platsen varierar beroende på version av Windows och om du använder mappomdirigering eller inte. Microsoft OneDrive kan också ändra platsen för mappen Dokument . Du kan kontrollera platsen för mappen Dokument med följande kommando: [Environment]::GetFolderPath('MyDocuments').
Konstruktion av PowerShell PSModulePath
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
PSModulePathdet inte finns kan du kombinera CurrentUser, AllUsers och modulernas$PSHOMEsökvägar - Om
PSModulePathfinns:- Om
PSModulePathinnehåller$PSHOMEmodulsökväg:- Sökvägen för Allaanvändare-moduler infogas före
$PSHOMEmodulsökvägen
- Sökvägen för Allaanvändare-moduler infogas före
- annars:
PSModulePathAnvänd bara som definierat eftersom användaren avsiktligt har tagit bort$PSHOMEplatsen
- Om
Modulsökvägen CurrentUser är endast prefix om användaromfånget $env:PSModulePath inte finns. Annars används användaromfånget $env:PSModulePath som definierat.
PowerShell 7-start
För de flesta miljövariabler i Windows används värdet endast i en ny process, om variabeln med användaromfattning finns, även om det finns en variabel med datoromfång med samma namn.
I PowerShell 7 PSModulePath behandlas på Path liknande sätt som miljövariabeln behandlas i Windows. I Windows Path behandlas annorlunda än andra miljövariabler. När en process startas kombinerar Windows användaromfånget Path med datoromfånget Path.
- Hämta användaromfånget
PSModulePath - Jämför med variabeln bearbeta ärvd
PSModulePathmiljö- Om samma sak gäller:
- Lägg till Allaanvändare
PSModulePathi slutet efter miljövariabelnsPathsemantik - Windows-sökvägen
System32kommer från den dator som definieratsPSModulePathså behöver inte läggas till explicit
- Lägg till Allaanvändare
- Om det är annorlunda behandlar du som om användaren uttryckligen ändrade det och lägger inte till Allaanvändare
PSModulePath
- Om samma sak gäller:
- Prefix med PS7-användare, system och
$PSHOMEsökvägar i den ordningen- Om
powershell.config.jsoninnehåller ett användaromfångPSModulePathanvänder du det i stället för standardinställningen för användaren - Om
powershell.config.jsoninnehåller ett systemomfångPSModulePathanvänder du det i stället för standardinställningen för systemet
- Om
Unix-system har ingen separation 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 betyder 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 som den är med tillägget av ärvande sökvägar som Windows PowerShell 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). Det här sökmönstret gör att flera versioner av samma modul kan installeras i olika mappar. 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 specifik 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 C:\Program Files\Fabrikam\Modules katalogen $env:PSModulePath i 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å plattformar som inte är Windows separerar kolonet (:) sökvägsplatserna i miljövariabeln.
Ändra PSModulePath i icke-Windows
Om du vill ändra värdet PSModulePath för 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 PSModulePath för för varje session i en Windows-miljö redigerar du registernyckeln PSModulePath som lagrar värdena. Värdena PSModulePath lagras i registret som icke-expanderade strängar. Om du vill undvika att permanent spara PSModulePath värdena som expanderade strängar använder du metoden GetValue på undernyckeln och redigerar värdet direkt.
I följande exempel läggs 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 += ';C:\Program Files\Fabrikam\Modules' # or '%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:\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)