Informazioni su PSModulePath

Breve descrizione

Questo articolo descrive lo scopo e l'utilizzo della $Env:PSModulePath variabile di ambiente.

Descrizione lunga

La $Env:PSModulePath variabile di ambiente contiene un elenco di percorsi delle cartelle. PowerShell cerca in modo ricorsivo ogni cartella per individuare i file del modulo (.psd1 o .psm1).

Per impostazione predefinita, le posizioni effettive assegnate a $Env:PSModulePath sono:

  • I moduli installati nell'ambito CurrentUser vengono archiviati in $HOME\Documents\WindowsPowerShell\Modules.
  • I moduli installati nell'ambito AllUsers vengono archiviati in $Env:ProgramFiles\WindowsPowerShell\Modules.
  • Moduli forniti con Windows PowerShell archiviati in $PSHOME\Modules, ovvero $Env:SystemRoot\System32\WindowsPowerShell\1.0\Modules.

Costruzione di PowerShell PSModulePath

Il valore di $Env:PSModulePath viene costruito ogni volta che viene avviato PowerShell. Il valore varia in base alla versione di PowerShell e alla modalità di avvio.

Avvio di Windows PowerShell

Windows PowerShell usa la logica seguente per costruire l'oggetto all'avvio PSModulePath :

  • Se PSModulePath non esiste, combinare CurrentUser, AllUsers e i percorsi dei $PSHOME moduli
  • Se PSModulePath esiste:
    • Se PSModulePath contiene $PSHOME il percorso dei moduli:
      • Il percorso dei moduli AllUsers viene inserito prima $PSHOME del percorso dei moduli
    • altro:
      • PSModulePath Usare semplicemente come definito perché l'utente ha rimosso deliberatamente la $PSHOME posizione

Il percorso del modulo CurrentUser è preceduto solo se l'ambito $Env:PSModulePath utente non esiste. In caso contrario, l'ambito $Env:PSModulePath utente viene usato come definito.

Note

Quando Windows PowerShell viene eseguito in un albero dei processi che contiene PowerShell 7, può ereditare un PSModulePath valore che include i percorsi dei moduli di PowerShell 7. PowerShell 7 rimuove i propri percorsi di modulo all'avvio diretto Windows PowerShell, ma non quando Windows PowerShell viene avviato tramite un processo intermedio. I percorsi dei moduli di PowerShell 7 ereditati precedono il percorso del modulo di sistema di PowerShell Windows, che può causare il caricamento dei nomi dei moduli condivisi, ad esempio Microsoft.PowerShell.Utility, per risolvere le versioni del modulo di PowerShell 7 che Windows PowerShell non è in grado di caricare. Questo interrompe il caricamento automatico del modulo. Per altre informazioni e soluzioni alternative, vedere la versione di PowerShell 7 di questo articolo.

Comportamento di ricerca del modulo

PowerShell esegue una ricerca ricorsiva in ogni cartella nei file del modulo ( o .psd1) di .psm1. Questo modello di ricerca consente l'installazione di più versioni dello stesso modulo in cartelle diverse. Ad esempio:

    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

Per impostazione predefinita, PowerShell carica il numero di versione più alto di un modulo quando vengono trovate più versioni. Per caricare una versione specifica, usare Import-Module con il parametro FullyQualifiedName . Per altre informazioni, vedere Import-Module.

Modifica di PSModulePath

Per la maggior parte delle situazioni, è consigliabile installare i moduli nelle posizioni predefinite del modulo. Potrebbe tuttavia essere necessario modificare il valore della PSModulePath variabile di ambiente.

Ad esempio, per aggiungere temporaneamente la C:\Program Files\Fabrikam\Modules directory a $Env:PSModulePath per la sessione corrente, digitare:

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

Per modificare il valore di PSModulePath in ogni sessione, modificare la chiave del Registro di sistema che archivia i PSModulePath valori. I PSModulePath valori vengono archiviati nel Registro di sistema come stringhe non espanse . Per evitare di salvare in modo permanente i PSModulePath valori come stringhe espanse , usare il GetValue() metodo nella sottochiave e modificare direttamente il valore.

Nell'esempio seguente viene aggiunto il C:\Program Files\Fabrikam\Modules percorso al valore della variabile di PSModulePath ambiente senza espandere le stringhe non espanse.

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

Per aggiungere un percorso all'impostazione utente, usare il codice seguente:

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

Vedere anche