Sdílet prostřednictvím


about_PSModulePath

Krátký popis

Tento článek popisuje účel a použití proměnné prostředí $Env:PSModulePath.

Dlouhý popis

Proměnná prostředí $Env:PSModulePath 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í složky Documents 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í složky Documents. Pokud chcete ověřit umístění složky Documents, spusťte následující příkaz: [Environment]::GetFolderPath('MyDocuments').
    • V systémech jiných než Windows jsou tyto moduly uložené ve složce $HOME/.local/share/powershell/Modules.
  • 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.
  • 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 do jiných adresářů ve Windows, jako je například složka Program Files. Instalační balíček nemusí připojit umístění k $Env:PSModulePath.

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 v 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í PSModulePath při spuštění následující logiku:

  • Pokud PSModulePath neexistuje, zkombinujte CurrentUser, AllUsersa cesty k modulům $PSHOME.
  • Pokud PSModulePath existuje:
    • Pokud PSModulePath obsahuje cestu k modulům $PSHOME:
      • cesta k modulům AllUsers se vloží před cestu k modulům $PSHOME
    • jiný:
      • Stačí použít PSModulePath tak, jak je definováno, protože uživatel záměrně odebral $PSHOME umístění.

Cesta k modulu CurrentUser je předpona pouze v případě, že obor uživatele $Env:PSModulePath neexistuje. V opačném případě se $Env:PSModulePath oboru uživatele použije podle definice.

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. Cesta proměnných prostředí se zpracovává odlišně.

Ve Windows se PSModulePath zachází podobně jako s Path proměnnou prostředí. Path se zachází jinak než s jinými proměnnými prostředí. Při spuštění procesu systém Windows kombinuje Path s Paths oborem počítače .

  • Načtení PSModulePath s oborem uživatele
  • Porovnání s procesem zděděným PSModulePath proměnnou prostředí
    • Pokud je to stejné:
      • Připojte AllUsersPSModulePath na konec za sémantikou proměnné prostředí PATH.
      • Cesta windows System32 pochází z počítače definovaného PSModulePath, takže není nutné explicitně přidávat.
    • Pokud se liší, považují se za uživatele, který ho explicitně upravil, a nepřipojujte AllUsersPSModulePath
  • Předpona uživatelem PS7, systémem a $PSHOME cestami v daném pořadí
    • Pokud powershell.config.json obsahuje PSModulePaths vymezeným oborem uživatele, použijte místo výchozího nastavení uživatele.
    • Pokud powershell.config.json obsahuje systém vymezený PSModulePath, použijte místo výchozího nastavení systému.

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á powershell.exe i powershell_ise.exe.

Hodnota $Env:PSModulePath se zkopíruje do WinPSModulePath s následujícími úpravami:

  • Odebrání cesty modulu uživatele PS7
  • Odebrání cesty systémového modulu PS7
  • Odebrání cesty modulu $PSHOME PS7

Cesty PS7 se odeberou, aby se moduly PS7 nenačetly ve Windows PowerShellu. Hodnota WinPSModulePath 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 as-is 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 modulů (.psd1 nebo .psm1). Tento vzor vyhledávání umožňuje instalaci více verzí stejného modulu do různých složek. Napří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 proměnné prostředí PSModulePath.

Pokud chcete například dočasně přidat adresář C:\Program Files\Fabrikam\Modules do $Env:PSModulePath pro 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í cest 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 tak, aby ukládaly hodnoty PSModulePath. Hodnoty PSModulePath jsou uloženy v registru jako nevyexpandované řetězce. Pokud se chcete vyhnout trvalému ukládání hodnot PSModulePath jako rozbalených řetězců, použijte GetValue() metodu na podklíči a upravte hodnotu přímo.

Následující příklad přidá cestu C:\Program Files\Fabrikam\Modules k hodnotě proměnné prostředí PSModulePath bez rozbalení nerozbalený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)

Viz také