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-Modulemá 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.
  • 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žky Documents 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:PSModulePathsouboru .

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.
    • Jiného:
      • Stačí ho použít PSModulePath tak, jak je definováno, protože uživatel záměrně odebral $PSHOME umístění.

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 PathPathpočí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ého PSModulePath počí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
  • Předpona uživatelem PS7, systémem a $PSHOME cestami v daném pořadí
    • Pokud powershell.config.json obsahuje obor PSModulePathuživatele, použijte místo výchozího nastavení uživatele.
    • Pokud powershell.config.json obsahuje systém s vymezeným PSModulePathoborem , použijte místo výchozí hodnoty pro systém.

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)

Viz také