Megosztás a következőn keresztül:


about_PSModulePath

Rövid leírás

Ez a cikk a környezeti változó célját és használatát $Env:PSModulePath ismerteti.

Hosszú leírás

A $Env:PSModulePath környezeti változó a mappahelyek listáját tartalmazza. A PowerShell rekurzív módon keres minden mappában modul -.psd1 vagy .psm1) fájlokat.

Alapértelmezés szerint a hozzárendelt $Env:PSModulePath tényleges helyek a következők:

  • A CurrentUser hatókörben telepített modulok:
    • Windows rendszeren ezek a modulok a következő helyen vannak tárolva $HOME\Documents\PowerShell\Modules: . A mappa adott helye a Documents Windows verziójától és a mappaátirányítás használatakor eltérő. Emellett a Microsoft OneDrive módosíthatja a Documents mappa helyét. A mappa helyének Documents ellenőrzéséhez futtassa a következő parancsot: [Environment]::GetFolderPath('MyDocuments').
    • A nem Windows rendszerű rendszereken ezek a modulok a $HOME/.local/share/powershell/Modules mappában vannak tárolva.
  • Az AllUsers hatókörben telepített modulok:
    • Windows rendszeren ezek a modulok a következő helyen vannak tárolva $Env:ProgramFiles\PowerShell\Modules: .
    • A nem Windows rendszerű rendszereken ezek a modulok a következő helyen vannak tárolva /usr/local/share/powershell/Modules: .
  • A PowerShell-lel szállított modulok tárolása a következő helyen $PSHOME\Modulestörténik: .

Feljegyzés

A PowerShell-modulokat tartalmazó alkalmazások más könyvtárakban is telepíthetnek modulokat Windows rendszeren, például a Program Files mappában. Előfordulhat, hogy a telepítőcsomag nem fűzi hozzá a helyet a $Env:PSModulePath.

A Windows PowerShell 5.1 alapértelmezett helyei eltérnek a PowerShell 7-től.

  • A CurrentUser hatókörben telepített modulok tárolása a következő helyen $HOME\Documents\WindowsPowerShell\Modulestörténik: .
  • Az AllUsers hatókörben telepített modulok tárolása a következő helyen $Env:ProgramFiles\WindowsPowerShell\Modulestörténik: .
  • A Windows PowerShell-lel szállított modulok, amelyek $PSHOME\Modulesa következő helyen $Env:SystemRoot\System32\WindowsPowerShell\1.0\Modulestalálhatók: .

A PowerShell PSModulePath felépítése

Az érték $Env:PSModulePath a PowerShell minden indításakor létre lesz építve. Az érték a PowerShell verziója és az indítási módjától függően változik.

Windows PowerShell indítása

A Windows PowerShell az alábbi logikát használja a rendszerindításkor:PSModulePath

  • Ha PSModulePath nem létezik, kombinálja a CurrentUser, az AllUsers és a $PSHOME modulok elérési útját
  • Ha PSModulePath létezik:
    • Ha PSModulePath tartalmazza a $PSHOME modulok elérési útját:
      • Az AllUsers-modulok elérési útja a modulok elérési útja előtt $PSHOME van beszúrva
    • más:
      • Csak a megadott módon használja PSModulePath , mivel a felhasználó szándékosan eltávolította a $PSHOME helyet

A CurrentUser modul elérési útja csak akkor van előtagban, ha a felhasználói hatókör $Env:PSModulePath nem létezik. Ellenkező esetben a felhasználó hatóköre $Env:PSModulePath a definiált módon van használva.

A PowerShell 7 indítása

Windows rendszerben a legtöbb környezeti változó esetében, ha a felhasználó által hatókörbe tartozó változó létezik, egy új folyamat csak ezt az értéket használja, még akkor is, ha egy azonos nevű gépi hatókörű változó létezik. Az elérésiút-környezeti változók eltérően lesznek kezelve.

Windows PSModulePath rendszeren a rendszer a környezeti változóhoz hasonlóan Path kezeli. Path más környezeti változóktól eltérően kezelik. Amikor egy folyamat elindul, a Windows egyesíti a felhasználó hatókörét Path a gép hatókörével Path.

  • A felhasználó hatókörének lekérése PSModulePath
  • Összehasonlítás az örökölt környezeti változó feldolgozásához PSModulePath
    • Ha ugyanaz:
      • Fűzze hozzá az AllUserstPSModulePath a környezetváltozó szemantikáját PATH követő végéhez
      • A Windows System32 elérési útja a megadott PSModulePath gépről származik, ezért nem kell explicit módon hozzáadni
    • Ha más, kezelje úgy, mintha a felhasználó explicit módon módosította volna, és ne fűzze hozzá az AllUserstPSModulePath
  • Előtag PS7 felhasználóval, rendszerrel és $PSHOME elérési utakkal ebben a sorrendben
    • Ha powershell.config.json a felhasználó hatóköre PSModulePathvan, használja azt a felhasználó alapértelmezett beállítása helyett
    • Ha powershell.config.json a rendszer hatókörrel PSModulePathrendelkezik, használja azt a rendszer alapértelmezett beállítása helyett

A nem Windows rendszerű rendszerek nem különíthetők el a felhasználói és a rendszerkörnyezeti változóktól. PSModulePath öröklődik, és a PS7-specifikus elérési utak előtaggal vannak elnevezettek, ha még nincs definiálva.

A Windows PowerShell indítása a PowerShell 7-ből

Ebben a vitafórumban a Windows PowerShell azt jelenti, hogy mind powershell.exe a powershell_ise.exe.

A program a következő módosításokkal másolja $Env:PSModulePath át az értékeketWinPSModulePath:

  • A PS7 eltávolítása a felhasználói modul elérési útjára
  • A PS7 eltávolítása a rendszermodul elérési útjára
  • A PS7 eltávolítása a modul elérési útjára $PSHOME

A PS7-útvonalak el lesznek távolítva, hogy a PS7-modulok ne töltődhessenek be a Windows PowerShellbe. Az WinPSModulePath érték a Windows PowerShell indításakor használatos.

A PowerShell 7 indítása a Windows PowerShellből

A PowerShell 7 indítása a Windows PowerShell által hozzáadott öröklő útvonalak hozzáadásával folytatódik. Mivel a PS7-specifikus elérési utak előtaggal vannak elnevezve, nincs funkcionális probléma.

Modulkeresési viselkedés

A PowerShell rekurzív módon keres a PSModulePath minden mappájában modul - vagy.psd1.psm1) fájlokat. Ez a keresési minta lehetővé teszi ugyanannak a modulnak több verzióját is különböző mappákba telepíteni. Példa:

    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

Alapértelmezés szerint a PowerShell betölti a modul legmagasabb verziószámát, ha több verziót talál. Egy adott verzió betöltéséhez használja Import-Module a FullyQualifiedName paramétert. További információ: Import-Module.

A PSModulePath módosítása

A legtöbb esetben az alapértelmezett modulhelyeken kell telepítenie a modulokat. Előfordulhat azonban, hogy módosítania kell a PSModulePath környezeti változó értékét.

Ha például ideiglenesen hozzá szeretné adni a C:\Program Files\Fabrikam\Modules könyvtárat $Env:PSModulePath az aktuális munkamenethez, írja be a következőt:

$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"

A parancsban lévő pontosvessző (;) elválasztja az új elérési utat a listában azt megelőző elérési úttól. Nem Windows-platformokon a kettőspont (:) elválasztja az elérési utak helyét a környezeti változóban.

PSModulePath módosítása nem Windows rendszerben

Ha nem Windows-környezetben szeretné módosítani az összes munkamenet értékét PSModulePath , adja hozzá az előző parancsot a PowerShell-profiljához.

A PSModulePath módosítása a Windowsban

Ha minden munkamenetben módosítani szeretné az értékeket PSModulePath , szerkessze az értékeket tároló PSModulePath beállításkulcsot. Az PSModulePath értékek a beállításjegyzékben feloldatlan sztringekként vannak tárolva . Az értékek kibontott sztringekkéntPSModulePathvaló végleges mentésének elkerülése érdekében használja az GetValue() alkulcs metódusát, és szerkessze közvetlenül az értéket.

Az alábbi példa a környezeti változó értékéhez adja hozzá az C:\Program Files\Fabrikam\Modules elérési utat a PSModulePath fel nem használt sztringek kibontása nélkül.

$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)

Ha elérési utat szeretne hozzáadni a felhasználói beállításhoz, használja a következő kódot:

$key = (Get-Item 'HKCU:\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Lásd még