Dela via


about_PSModulePath

Kort beskrivning

Den här artikeln beskriver syftet med och användningen av $env:PSModulePath miljövariabeln.

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 CurrentUser-omfånget:
    • I Windows lagras dessa moduler i $HOME\Documents\PowerShell\Modules. Den specifika platsen för mappen varierar beroende på Documents version av Windows och när du använder mappomdirigering. Dessutom kan Microsoft OneDrive ändra platsen för din Documents mapp. Om du vill kontrollera platsen för mappen Documents kör du följande kommando: [Environment]::GetFolderPath('MyDocuments').
    • I icke-Windows-system lagras dessa moduler i $HOME/.local/share/powershell/Modules mappen .
  • Moduler installerade i AllUsers-omfånget :
    • I Windows lagras dessa moduler i $env:ProgramFiles\PowerShell\Modules.
    • I andra system än Windows lagras dessa moduler i /usr/local/share/powershell/Modules.
  • Moduler som levereras med PowerShell lagras i $PSHOME\Modules.

Kommentar

Program som innehåller PowerShell-moduler kan installera moduler i andra kataloger i Windows, till exempel mappen Program Files . Installationspaketet 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ånget lagras i $HOME\Documents\WindowsPowerShell\Modules.
  • Moduler som är installerade i AllUsers-omfånget 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 $env:PSModulePath för 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 PSModulePath det inte finns kan du kombinera CurrentUser, AllUsers och $PSHOME modulernas sökvägar
  • Om PSModulePath finns:
    • Om PSModulePath innehåller $PSHOME modulsökväg:
      • Sökvägen för AllUsers-moduler infogas före $PSHOME modulsökvägen
    • annars:
      • PSModulePath Använd bara som definierat eftersom användaren avsiktligt tog bort platsen $PSHOME

Modulsökvägen CurrentUser är endast prefix 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. Sökvägsmiljövariablerna behandlas på olika sätt.

I Windows PSModulePath behandlas på liknande sätt som Path miljövariabeln behandlas. Path behandlas annorlunda än andra miljövariabler. När en process startas kombinerar Windows användaromfattningen Path med machine-scoped Path.

  • Hämta användaromfattningen PSModulePath
  • Jämför med bearbeta ärvda miljövariabler PSModulePath
    • Om samma sak gäller:
      • Lägg till Allaanvändare PSModulePath i slutet efter semantiken i Path miljövariabeln
      • Windows-sökvägen System32 kommer från den dator som definierats PSModulePath så behöver inte läggas till explicit
    • Om det är annorlunda behandlar du som om användaren uttryckligen ändrade det och lägger inte till Allaanvändare PSModulePath
  • Prefix med PS7-användare, system och $PSHOME sökvägar i den ordningen
    • Om powershell.config.json innehåller ett användaromfång PSModulePathanvänder du det i stället för standardvärdet för användaren
    • Om powershell.config.json innehåller ett systemomfång PSModulePathanvänder du det i stället för standardinställningen för systemet

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 som den är med tillägget 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 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 katalogen $env:PSModulePath i C:\Program Files\Fabrikam\Modules 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 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 i varje session redigerar du registernyckeln som PSModulePath lagrar värdena. Värdena PSModulePath lagras i registret som oexpandererade strängar. Om du vill undvika att permanent spara PSModulePath värdena som expanderade strängar använder du GetValue() metoden i 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 de oexpanderade strängarna expanderas.

$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)

Se även