Condividi tramite


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 che vengono cercati 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 che vengono forniti con PowerShell. Questi moduli vengono archiviati 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 moduli installati nell'ambito CurrentUser vengono in genere archiviati nella $HOME\Documents\WindowsPowerShell\Modules cartella. La posizione specifica della Documents cartella varia in base alla versione di Windows e quando si usa il reindirizzamento delle cartelle. Microsoft OneDrive può anche modificare il percorso della Documents cartella. È possibile verificare il percorso della Documents cartella usando il comando seguente: [Environment]::GetFolderPath('MyDocuments').

    Nei sistemi non Windows i moduli installati nell'ambito CurrentUser vengono archiviati nella $HOME/.local/share/powershell/Modules 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ò o non aggiungere il percorso all'oggetto $env:PSModulePath.

Costruzione di PowerShell PSModulePath

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

Avvio Windows PowerShell

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

  • 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:
      • Usare PSModulePath solo come definito dall'utente ha rimosso intenzionalmente 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.

Avvio di PowerShell 7

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

In PowerShell 7 viene PSModulePath trattato in modo simile al modo in cui la Path variabile di ambiente viene trattata in Windows. In Windows viene Path trattato in modo diverso da altre variabili di ambiente. Quando viene avviato un processo, Windows combina l'ambito utente con l'ambito PathPathcomputer .

  • Recuperare l'ambito utente PSModulePath
  • Confrontare la variabile di ambiente ereditata dal PSModulePath processo
    • Se lo stesso:
      • Aggiungere AllUsersPSModulePath alla fine la semantica della variabile di Path ambiente
      • Il percorso di Windows System32 proviene dal computer definito PSModulePath in modo da non dover essere aggiunto in modo esplicito
    • Se diverso, considerare come se l'utente lo modificasse in modo esplicito e non accoda AllUsersPSModulePath
  • Prefisso con PS7 User, System e $PSHOME percorsi in tale ordine
    • Se powershell.config.json contiene un utente con ambito PSModulePath, usare invece dell'impostazione predefinita per l'utente
    • Se powershell.config.json contiene un ambito PSModulePathdi sistema, usare invece dell'impostazione predefinita per il sistema

I sistemi Unix non dispongono di una separazione delle variabili di ambiente utente e di sistema. PSModulePath viene ereditato e i percorsi specifici di PS7 vengono preceduti se non 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 PS7 il percorso del $PSHOME modulo

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

Avvio di PowerShell 7 da Windows PowerShell

L'avvio di PowerShell 7 continua così come è con l'aggiunta di percorsi di ereditazione che Windows PowerShell aggiunto. Poiché i percorsi specifici di PS7 sono preceduti, non esiste alcun problema funzionale.

Comportamento della ricerca del modulo

PowerShell cerca in modo ricorsivo ogni cartella nei file PSModulePath per i file module (.psd1 o .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 ulteriori 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 C:\Program Files\Fabrikam\Modules directory 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 i percorsi del percorso 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 PSModulePath valori. I PSModulePath valori vengono archiviati nel Registro di sistema come stringhe non crittografate . Per evitare di salvare definitivamente i PSModulePath valori come stringhe espanse , usare il metodo GetValue nella sottochiave e modificare direttamente il valore.

Nell'esempio PSModulePath seguente viene aggiunto il C:\Program Files\Fabrikam\Modules percorso al valore della variabile di 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)

Vedi anche