Condividi tramite


Informazioni su PSModulePath

Breve descrizione

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

Descrizione lunga

La variabile di ambiente $env:PSModulePath contiene un elenco di percorsi delle cartelle in cui viene eseguita la ricerca per trovare moduli e risorse. PowerShell cerca in modo ricorsivo ogni cartella per i file del modulo (.psd1 o .psm1).

Install-Module ha un parametro Scope che consente di specificare se il modulo è installato per l'utente corrente o per tutti gli utenti. Per altre informazioni, vedere Install-Module.

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

  • Percorsi a livello di sistema: queste cartelle contengono moduli forniti con PowerShell. Questi moduli sono memorizzati nella $PSHOME\Modules cartella.

    • In Windows, i moduli installati nell'ambito AllUsers vengono archiviati in $env:ProgramFiles\WindowsPowerShell\Modules.
    • Nei sistemi non Windows, i moduli installati nell'ambito AllUsers vengono archiviati in /usr/local/share/powershell/Modules.
  • Moduli installati dall'utente: in Windows, i $HOME\Documents\WindowsPowerShell\Modules moduli installati nell'ambito CurrentUser vengono in genere archiviati nella cartella. Il percorso specifico della cartella Documents varia in base alla versione di Windows e quando si usa il reindirizzamento delle cartelle. Inoltre, Microsoft OneDrive può modificare il percorso della cartella Documents. È possibile verificare la posizione della Documents cartella utilizzando il seguente comando: [Environment]::GetFolderPath('MyDocuments').

    Nei sistemi non Windows, i $HOME/.local/share/powershell/Modules moduli installati nell'ambito CurrentUser vengono archiviati nella cartella.

  • Moduli specifici dell'applicazione: i programmi di installazione possono installare moduli in altre directory, ad esempio la Program Files cartella in Windows. Il pacchetto del programma di installazione può aggiungere o meno il percorso a $env:PSModulePath.

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 il PSModulePath all'avvio:

  • Se PSModulePath non esiste, combina CurrentUser, AllUserse i percorsi dei moduli $PSHOME
  • Se PSModulePath esiste:
    • Se PSModulePath contiene il percorso dei moduli $PSHOME:
      • Il percorso dei moduli AllUsers è inserito prima del percorso dei moduli $PSHOME.
    • altro:
      • È sufficiente usare PSModulePath come definito perché l'utente ha rimosso deliberatamente la posizione $PSHOME

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

Avvio di PowerShell 7

In Windows, per la maggior parte delle variabili di ambiente, se la variabile con ambito utente esiste, un nuovo processo usa tale valore solo se esiste una variabile con ambito computer con lo stesso nome.

In PowerShell 7, PSModulePath viene trattato in modo simile a come viene trattata la Path variabile di ambiente in Windows. Su Windows, Path viene trattato in modo diverso da altre variabili di ambiente. Quando viene avviato un processo, Windows combina l'Path ad ambito utente con l'Pathad ambito computer.

  • Recuperare il PSModulePath dell'ambito utente
  • Confrontare il processo con la variabile di ambiente ereditata PSModulePath
    • Se lo stesso:
      • Aggiungere il AllUsersPSModulePath alla fine seguendo la semantica della variabile di ambiente Path
      • Il percorso di Windows System32 proviene dal computer definito PSModulePath , quindi non deve essere aggiunto in modo esplicito
    • Se diverso, trattare come se l'utente lo avesse modificato in modo esplicito e non accodare AllUsersPSModulePath
  • Prefisso con i percorsi utente, sistema e $PSHOME PS7 in tale ordine
    • Se powershell.config.json contiene un PSModulePathspecifico per l'utente, utilizzare quello invece dell'impostazione predefinita per l'utente.
    • Se powershell.config.json contiene un PSModulePathcon ambito a livello di sistema, usa quello al posto del valore predefinito per il sistema.

I sistemi Unix non hanno una separazione delle variabili di ambiente utente e di sistema. PSModulePath è ereditato e i percorsi specifici di PS7 sono preceduti da un prefisso se non sono già definiti.

Avvio di Windows PowerShell da PowerShell 7

Per questa discussione, Windows PowerShell significa sia powershell.exe che powershell_ise.exe.

Il valore di $env:PSModulePath viene copiato in WinPSModulePath con le modifiche seguenti:

  • Rimuovere PS7 il percorso del modulo Utente
  • Rimuovere PS7 il percorso del modulo di sistema
  • Rimuovere il percorso del modulo $PSHOME in PS7

I percorsi PS7 vengono rimossi in modo che i moduli PS7 non vengano caricati in Windows PowerShell. Il valore WinPSModulePath viene usato quando si avvia Windows PowerShell.

Avvio di PowerShell 7 da Windows PowerShell

L'avvio di PowerShell 7 continua as-is con l'aggiunta di percorsi di ereditarietà aggiunti da Windows PowerShell. Poiché i percorsi specifici di PS7 sono preceduti da un prefisso, non esiste alcun problema funzionale.

Comportamento di ricerca del modulo

PowerShell cerca in modo ricorsivo ogni cartella nel PSModulePath per i file del modulo (.psd1 o .psm1). Questo modello di ricerca consente l'installazione di più versioni dello stesso modulo in cartelle diverse. Per 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. Tuttavia, potrebbe essere necessario modificare il valore della variabile di PSModulePath ambiente.

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

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

Il punto e virgola (;) nel comando separa il nuovo percorso dal percorso che lo precede nell'elenco. Nelle piattaforme non Windows, i due punti (:) separano le posizioni dei percorsi nella variabile di ambiente.

Modifica di PSModulePath in non Windows

Per modificare il valore di PSModulePath per ogni sessione in un ambiente non Windows, aggiungere il comando precedente al profilo di PowerShell.

Modifica di PSModulePath in Windows

Per modificare il valore di PSModulePath in ogni sessione, modificare la chiave del Registro di sistema che archivia i valori PSModulePath. I valori vengono archiviati nel Registro di sistema come stringhe non espanse . Per evitare di salvare definitivamente i PSModulePath valori come stringhe espanse , utilizzare il metodo GetValue sulla 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').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Per aggiungere un percorso all'impostazione utente, modificare il provider del Registro di sistema da HKLM:\ a 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)

Vedere anche