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.

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í. Napří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 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é