Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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íDocumentsslož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šíDocumentsslož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/Modulesslož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:PSModulePathsouboru .
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
PSModulePathneexistuje, zkombinujte CurrentUser, AllUsers a cesty modulů.$PSHOME - Pokud
PSModulePathexistuje:- Pokud
PSModulePathobsahuje$PSHOMEcestu k modulům:-
Cesta k modulům AllUsers se vloží před
$PSHOMEcestu k modulům.
-
Cesta k modulům AllUsers se vloží před
- jiný:
- Stačí ho použít
PSModulePathtak, jak je definováno, protože uživatel záměrně odebral$PSHOMEumí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 PathPathpočítače .
- Načtení oboru uživatele
PSModulePath - Porovnání s zděděnou proměnnou
PSModulePathprostředí- Pokud je to stejné:
-
PSModulePath. - Cesta Windows
System32pochází z definovanéhoPSModulePathpočítače, takže není nutné explicitně přidávat.
-
- 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
$PSHOMEcestami v daném pořadí- Pokud
powershell.config.jsonobsahuje oborPSModulePathuživatele, použijte místo výchozího nastavení uživatele. - Pokud
powershell.config.jsonobsahuje systém s vymezenýmPSModulePathoborem , 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.
Tato změna platí jenom pro Windows procesy PowerShellu, které PowerShell 7 spouští přímo. Při spuštění Windows PowerShellu prostřednictvím zprostředkujícího procesu, jako cmd.exe je proces nebo Python spuštěný PowerShell 7, zdědí zprostředkující proces nezměněný $Env:PSModulePath z PowerShellu 7 a předá ho vlastním podřízeným procesům. Windows Spuštění PowerShellu tímto způsobem zachová zděděné cesty k modulům PowerShellu 7. Vzhledem k tomu, že tyto cesty předchází cestě k Windows systémovému modulu PowerShellu, Windows PowerShell dokáže přeložit názvy sdílených modulů, jako Microsoft.PowerShell.Utilityjsou verze modulu PowerShellu 7, které se nedají načíst. Tím se přeruší automatické načítání modulu a rutiny z těchto modulů selžou s chybou CommandNotFoundException .
Pokud chcete spustit Windows PowerShellu z přechodného procesu se správnými cestami modulu, odeberte PSModulePath ho z prostředí podřízeného procesu. Windows PowerShellu pak vytvoří výchozí hodnotu při spuštění. Příklad:
V PowerShellu 7.4 a novějším použijte parametr
Start-Processprostředí k odebrání proměnné z prostředí zprostředkujícího procesu:Start-Process python harness.py -Environment @{ PSModulePath = $null }Před
cmd.exespuštěním Windows PowerShellu vymažte proměnnou:cmd /c "set PSModulePath=&& powershell.exe -File script.ps1"V Python odeberte proměnnou z prostředí, které předáte podřízeného procesu:
import os import subprocess env = {k: v for k, v in os.environ.items() if k.upper() != "PSMODULEPATH"} subprocess.run(["powershell.exe", "-File", "script.ps1"], env=env)
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)