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


A PSModulePath-ról

Rövid leírás

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

Hosszú leírás

A $env:PSModulePath környezeti változó a modulok és erőforrások keresésére keresendő mappahelyek listáját tartalmazza. A PowerShell rekurzív módon keres minden mappában modulfájlokat (.psd1 vagy .psm1).

Install-Module rendelkezik egy Hatókör paraméterrel, amely lehetővé teszi annak megadását, hogy a modul telepítve van-e az aktuális felhasználóra vagy az összes felhasználóra. További információ: Install-Module.

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

  • Rendszerszintű helyek: Ezek a mappák a PowerShell használatával szállított modulokat tartalmazzák. Ezeket a modulokat a mappa $PSHOME\Modules tárolja.

    • Windows rendszeren az AllUsers hatókörbe telepített modulok a .$env:ProgramFiles\WindowsPowerShell\Modules
    • Nem Windows rendszereken az AllUsers hatókörbe telepített modulok a /usr/local/share/powershell/Modules.
  • Felhasználó által telepített modulok: Windows rendszeren a CurrentUser hatókörbe telepített modulok általában a mappában $HOME\Documents\WindowsPowerShell\Modules vannak tárolva. A Documents mappa helye a 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 Documents helyét a következő paranccsal ellenőrizheti: [Environment]::GetFolderPath('MyDocuments').

    Nem Windows rendszereken a CurrentUser hatókörbe telepített modulok a $HOME/.local/share/powershell/Modules mappában vannak tárolva.

  • Alkalmazásspecifikus modulok: A telepítőprogramok modulokat telepíthetnek más könyvtárakba, például a Program Files Windows mappába. A telepítőcsomag hozzáfűzheti a helyet a $env:PSModulePath.

A PowerShell PSModulePath felépítése

A $env:PSModulePath értéke 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 a következő logikával hozza létre a PSModulePath indításkor:

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

A CurrentUser modul elérési útja csak akkor lesz előtaggal el van adva, ha a felhasználói hatókör $env:PSModulePath nem létezik. Ellenkező esetben a felhasználó hatóköre $env:PSModulePath a megadott módon lesz 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 akkor használja ezt az értéket, ha létezik egy azonos nevű gépi hatókörű változó.

A PowerShell 7-ben PSModulePath a környezeti változóhoz Path hasonlóan kezelik a Windows. Windows rendszeren Path a rendszer a többi környezeti változótól eltérően kezeli. Amikor egy folyamat elindul, a Windows egyesíti a felhasználó hatókörű Path a gépi hatókörű Path.

  • A felhasználó által hatókörbe tartozó PSModulePath lekérése
  • Összehasonlítás az örökölt PSModulePath környezeti változóval
    • Ha ugyanaz:
      • Fűzze hozzá a AllUsersPSModulePath a végéhez a Path környezeti változó szemantikája után
      • A Windows System32 elérési útja a gépről PSModulePath 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á AllUsersPSModulePath
  • Előtag PS7 felhasználóval, rendszerrel és $PSHOME elérési úttal ebben a sorrendben
    • Ha powershell.config.json egy felhasználó által hatókörrel rendelkező PSModulePathtartalmaz, használja azt a felhasználó alapértelmezett beállítása helyett
    • Ha powershell.config.json tartalmaz egy rendszer hatókörű PSModulePath, használja ezt a rendszer alapértelmezett beállítása helyett

A Unix-rendszerek nem különülnek 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 cikkben a Windows PowerShell powershell.exe és powershell_ise.exeis jelent.

A $env:PSModulePath értéke a következő módosításokkal lesz átmásolva WinPSModulePath:

  • 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 $PSHOME modul elérési útjára

A PS7-útvonalak el lesznek távolítva, hogy a PS7-modulok ne töltődhessenek be a Windows PowerShellbe. A 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ási as-is 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 modulfájlokat (.psd1 vagy .psm1). 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éldául:

    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 a Import-Module a FullyQualifiedName paraméterrel. 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 az aktuális munkamenet $env:PSModulePath, í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 módosítani szeretné a PSModulePath értékét egy nem Windows-környezetben lévő összes munkamenethez, 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é a PSModulePath értékét, szerkessze az PSModulePath értékeket tároló beállításkulcsot. A PSModulePath értékek sztringekként vannak tárolva a beállításjegyzékben. Ha nem szeretné véglegesen menteni az értékeket PSModulePathkibontott sztringként, használja a GetValue metódust az alkulcson, és szerkessze közvetlenül az értéket.

Az alábbi példa a nem bontott sztringek kibontása nélkül adja hozzá a C:\Program Files\Fabrikam\Modules környezeti változó értékének elérési PSModulePath útját.

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

Ha elérési utat szeretne hozzáadni a felhasználói beállításhoz, módosítsa a beállításjegyzék szolgáltatóját HKLM:\ erről 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)

Lásd még: