about_PSModulePath
Krátký popis
Tento článek popisuje účel a použití $env:PSModulePath
proměnné prostředí.
Dlouhý popis
$env:PSModulePath
Proměnná prostředí obsahuje seznam umístění složek, ve kterých se hledají moduly a prostředky. PowerShell rekurzivně prohledá jednotlivé složky pro soubory modulu (.psd1
nebo .psm1
).
Install-Module
má parametr Scope, který umožňuje určit, zda je modul nainstalován pro aktuálního uživatele nebo pro všechny uživatele. Další informace naleznete v tématu Install-Module.
Ve výchozím nastavení jsou efektivní umístění přiřazená $env:PSModulePath
:
Systémová umístění: Tyto složky obsahují moduly, které jsou dodávány pomocí PowerShellu. Tyto moduly jsou uložené ve
$PSHOME\Modules
složce.- V systému Windows jsou moduly nainstalované v oboru AllUsers uloženy v
$env:ProgramFiles\WindowsPowerShell\Modules
. - V systémech, které nejsou systémy Windows, jsou moduly nainstalované v oboru AllUsers uloženy v
/usr/local/share/powershell/Modules
.
- V systému Windows jsou moduly nainstalované v oboru AllUsers uloženy v
Uživatelem nainstalované moduly: V systému Windows jsou moduly nainstalované v oboru CurrentUser obvykle uloženy ve
$HOME\Documents\WindowsPowerShell\Modules
složce. Konkrétní umístěníDocuments
složky se liší podle verze Systému Windows a při použití přesměrování složky. Microsoft OneDrive může také změnit umístění vašíDocuments
složky. Umístění složkyDocuments
můžete ověřit pomocí následujícího příkazu:[Environment]::GetFolderPath('MyDocuments')
.V systémech jiných než Windows jsou moduly nainstalované v oboru CurrentUser uloženy ve
$HOME/.local/share/powershell/Modules
složce.Moduly specifické pro aplikace: Instalační programy mohou instalovat moduly do jiných adresářů, jako
Program Files
je složka ve Windows. Instalační balíček může nebo nemusí připojit umístění do$env:PSModulePath
souboru .
PowerShell PSModulePath – konstrukce
Hodnota $env:PSModulePath
se vytvoří při každém spuštění PowerShellu.
Hodnota se liší podle verze PowerShellu a způsobu spuštění.
Spuštění Windows PowerShellu
Windows PowerShell používá k vytvoření při spuštění následující logiku PSModulePath
:
- Pokud
PSModulePath
neexistuje, zkombinujte CurrentUser, AllUsers a cesty modulů.$PSHOME
- Pokud
PSModulePath
existuje:- Pokud
PSModulePath
obsahuje$PSHOME
cestu k modulům:- Cesta k modulům AllUsers se vloží před
$PSHOME
cestu k modulům.
- Cesta k modulům AllUsers se vloží před
- jiný:
- Stačí ho použít
PSModulePath
tak, jak je definováno, protože uživatel záměrně odebral$PSHOME
umístění.
- Stačí ho použít
- Pokud
Cesta modulu CurrentUser je předpona pouze v případě, že obor $env:PSModulePath
uživatele neexistuje. V opačném případě se obor $env:PSModulePath
uživatele použije jako definovaný.
Spuštění PowerShellu 7
Ve Windows pro většinu proměnných prostředí platí, že pokud existuje proměnná s oborem uživatele, použije nový proces tuto hodnotu pouze v případě, že existuje proměnná s oborem počítače se stejným názvem.
V PowerShellu 7 se zachází podobně jako s tím, PSModulePath
jak Path
se proměnná prostředí zpracovává ve Windows. Ve Windows Path
se pracuje jinak než s jinými proměnnými prostředí. Při spuštění procesu systém Windows kombinuje uživatele s oborem Path
Path
počítače .
- Načtení oboru uživatele
PSModulePath
- Porovnání s zděděnou proměnnou
PSModulePath
prostředí- Pokud je to stejné:
- Za sémantikou proměnné prostředí připojte na konec sémantiku
Path
AllUsersPSModulePath
. - Cesta Windows
System32
pochází z definovanéhoPSModulePath
počítače, takže není nutné explicitně přidávat.
- Za sémantikou proměnné prostředí připojte na konec sémantiku
- Pokud se liší, považují se za uživatele, který ho explicitně upravil, a nepřipojujte uživatele AllUsers.
PSModulePath
- Pokud je to stejné:
- Předpona uživatelem PS7, systémem a
$PSHOME
cestami v daném pořadí- Pokud
powershell.config.json
obsahuje oborPSModulePath
uživatele, použijte místo výchozího nastavení uživatele. - Pokud
powershell.config.json
obsahuje systém s vymezenýmPSModulePath
oborem , použijte místo výchozí hodnoty pro systém.
- Pokud
Systémy Unix nemají oddělení proměnných prostředí User a System.
PSModulePath
je zděděna a cesty specifické pro PS7 jsou předpony, pokud ještě nejsou definovány.
Spuštění Windows PowerShellu z PowerShellu 7
Pro tuto diskuzi windows PowerShell znamená obojí powershell.exe
i powershell_ise.exe
.
Hodnota $env:PSModulePath
se zkopíruje s WinPSModulePath
následujícími úpravami:
- Odebrání cesty modulu uživatele PS7
- Odebrání cesty systémového modulu PS7
- Odebrání cesty modulu PS7
$PSHOME
Cesty PS7 se odeberou, aby se moduly PS7 nenačetly ve Windows PowerShellu. Tato WinPSModulePath
hodnota se používá při spouštění Prostředí Windows PowerShell.
Spuštění PowerShellu 7 z Windows PowerShellu
Spuštění PowerShellu 7 pokračuje tak, jak je s přidáním zděděných cest, které přidal Windows PowerShell. Vzhledem k tomu, že cesty specifické pro PS7 jsou předpony, neexistuje žádný funkční problém.
Chování vyhledávání modulů
PowerShell rekurzivně prohledá jednotlivé složky v psModulePath pro soubory modulu (.psd1
nebo .psm1
). Tento vzor vyhledávání umožňuje instalaci více verzí stejného modulu do různých složek. Příklad:
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 ve výchozím nastavení načte nejvyšší počet verzí modulu, když se najde více verzí. Pokud chcete načíst konkrétní verzi, použijte Import-Module
s parametrem FullyQualifiedName . Další informace najdete v tématu Import-Module.
Úprava psModulePath
Ve většině situací byste měli instalovat moduly do výchozích umístění modulů. Možná ale budete muset změnit hodnotu PSModulePath
proměnné prostředí.
Pokud například chcete dočasně přidat C:\Program Files\Fabrikam\Modules
adresář pro $env:PSModulePath
aktuální relaci, zadejte:
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
Středník (;
) v příkazu odděluje novou cestu od cesty, která předchází v seznamu. Na platformách jiných než Windows odděluje dvojtečka (:
) umístění cesty v proměnné prostředí.
Úprava psModulePath v jiných systémech než Windows
Pokud chcete změnit hodnotu PSModulePath
pro každou relaci v prostředí mimo Windows, přidejte předchozí příkaz do profilu PowerShellu.
Úprava psModulePath ve Windows
Pokud chcete změnit hodnotu PSModulePath
v každé relaci, upravte klíč registru, do který se PSModulePath
ukládají hodnoty. Hodnoty PSModulePath
jsou uloženy v registru jako nevyexpandované řetězce. Abyste se vyhnuli trvalému ukládání PSModulePath
hodnot jako rozbalených řetězců, použijte metodu GetValue na podklíči a upravte hodnotu přímo.
Následující příklad přidá C:\Program Files\Fabrikam\Modules
cestu k hodnotě PSModulePath
proměnné prostředí bez rozbalení rozbalených řetězců.
$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)
Chcete-li přidat cestu k uživatelskému nastavení, změňte zprostředkovatele registru na HKLM:\
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)