Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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. PowerShell söker rekursivt igenom varje mapp efter modulfiler (.psd1 eller .psm1).
Som standard är de effektiva platser som tilldelats $Env:PSModulePath:
- Moduler installerade i omfånget CurrentUser:
- I Windows lagras dessa moduler i
$HOME\Documents\PowerShell\Modules. Den specifika platsen för mappenDocumentsvarierar beroende på version av Windows och när du använder mappomdirigering. Dessutom kan Microsoft OneDrive ändra platsen för dinDocumentsmapp. Om du vill kontrollera platsen för dinDocuments-mapp kör du följande kommando:[Environment]::GetFolderPath('MyDocuments'). - I andra system än Windows lagras modulerna i mappen
$HOME/.local/share/powershell/Modules.
- I Windows lagras dessa moduler i
- Moduler installerade i omfånget Allaanvändare:
- I Windows lagras dessa moduler i
$Env:ProgramFiles\PowerShell\Modules. - I andra system än Windows lagras dessa moduler i
/usr/local/share/powershell/Modules.
- I Windows lagras dessa moduler i
- Moduler som levereras med PowerShell lagras i
$PSHOME\Modules.
Not
Program som innehåller PowerShell-moduler kan installera moduler i andra kataloger i Windows, till exempel mappen Program Files. Installationsprogrammet kanske inte lägger till platsen i $Env:PSModulePath.
Standardplatserna för Windows PowerShell 5.1 skiljer sig från PowerShell 7.
- Moduler som är installerade i CurrentUser- omfång lagras i
$HOME\Documents\WindowsPowerShell\Modules. - Moduler som är installerade i AllUsers omfång lagras i
$Env:ProgramFiles\WindowsPowerShell\Modules. - Moduler som levereras med Windows PowerShell som lagras i
$PSHOME\Modules, vilket är$Env:SystemRoot\System32\WindowsPowerShell\1.0\Modules.
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 du startade det.
Windows PowerShell-start
Windows PowerShell använder följande logik för att skapa PSModulePath vid start:
- Om
PSModulePathinte finns kan du kombinera CurrentUser, AllUsersoch sökvägarna för$PSHOME-moduler - Om
PSModulePathfinns:- Om
PSModulePathinnehåller sökvägen$PSHOMEmoduler:- sökvägen Allaanvändare moduler infogas innan
$PSHOMEmodulsökväg
- sökvägen Allaanvändare moduler infogas innan
- annars:
- Använd bara
PSModulePathsom definierat eftersom användaren avsiktligt tog bort$PSHOMEplats
- 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. Den sökvägen miljövariabler behandlas på olika sätt.
I Windows behandlas PSModulePath på samma sätt som den Path miljövariabeln behandlas.
Path behandlas annorlunda än andra miljövariabler. När en process startas kombinerar Windows den användaromfattande Path med den datoromfångade Path.
- Hämta
PSModulePathmed användaromfattning - Jämför med processärvd
PSModulePathmiljövariabel- Om samma sak gäller:
- Lägg till Allaanvändare
PSModulePathtill slutet efter semantiken iPATHmiljövariabeln - Sökvägen för Windows
System32kommer från den dator som definieratsPSModulePathså 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
$PSHOMEsökvägar i den ordningen- Om
powershell.config.jsoninnehåller ett användaromfångPSModulePathanvänder du det i stället för standardvärdet för användaren - Om
powershell.config.jsoninnehåller en systemomfattningPSModulePathanvänder du den i stället för standardinställningen för systemet
- Om
Icke-Windows-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 oexpanderade strängarna.
$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)
Om du vill lägga till en sökväg till användarinställningen använder du följande kod:
$key = (Get-Item 'HKCU:\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)