about_PSModulePath
Krátký popis
Tento článek popisuje účel a použití $env:PSModulePath
proměnné prostředí.
Dlouhý popis
Proměnná $env:PSModulePath
prostředí obsahuje seznam umístění složek. PowerShell rekurzivně prohledá jednotlivé složky pro soubory modulu (.psd1
nebo .psm1
).
Ve výchozím nastavení jsou efektivní umístění přiřazená $env:PSModulePath
:
- Moduly nainstalované v oboru CurrentUser :
- Ve Windows jsou tyto moduly uloženy v
$HOME\Documents\PowerShell\Modules
. 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. Pokud chcete ověřit umístění složkyDocuments
, spusťte následující příkaz:[Environment]::GetFolderPath('MyDocuments')
. - V systémech jiných než Windows jsou tyto moduly uložené ve
$HOME/.local/share/powershell/Modules
složce.
- Ve Windows jsou tyto moduly uloženy v
- Moduly nainstalované v oboru AllUsers :
- Ve Windows jsou tyto moduly uloženy v
$env:ProgramFiles\PowerShell\Modules
. - V systémech, které nejsou systémy Windows, jsou tyto moduly uloženy v
/usr/local/share/powershell/Modules
.
- Ve Windows jsou tyto moduly uloženy v
- Moduly, které jsou dodávány pomocí PowerShellu, jsou uloženy v
$PSHOME\Modules
.
Poznámka:
Aplikace, které obsahují moduly PowerShellu, můžou instalovat moduly v jiných adresářích ve Windows, jako je například Program Files
složka. Instalační balíček nemusí připojit umístění do $env:PSModulePath
souboru .
Výchozí umístění pro Windows PowerShell 5.1 se liší od PowerShellu 7.
- Moduly nainstalované v oboru CurrentUser jsou uloženy v
$HOME\Documents\WindowsPowerShell\Modules
. - Moduly nainstalované v oboru AllUsers jsou uloženy v
$env:ProgramFiles\WindowsPowerShell\Modules
. - Moduly, které jsou dodávány pomocí Prostředí Windows PowerShell uložené v
$PSHOME\Modules
, což je$env:SystemRoot\System32\WindowsPowerShell\1.0\Modules
.
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, jakým jste ji spustili.
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. Proměnné prostředí cesty se zpracovávají odlišně.
Ve Windows se zachází podobně jako s tím, PSModulePath
jak se s proměnnou Path
prostředí zachází. Path
se zpracovává 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
Jiné systémy než Windows 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. Chcete-li se vyhnout trvalému ukládání PSModulePath
hodnot jako rozbalených řetězců, použijte GetValue()
metodu 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í nevyexpandovaných řetězců.
$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)
Pokud chcete přidat cestu k uživatelskému nastavení, použijte následující kód:
$key = (Get-Item 'HKCU:\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)