Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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\Modulescartella.- 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.
- In Windows, i moduli installati nell'ambito AllUsers vengono archiviati in
Moduli installati dall'utente: in Windows, i
$HOME\Documents\WindowsPowerShell\Modulesmoduli installati nell'ambito CurrentUser vengono in genere archiviati nella cartella. Il percorso specifico della cartellaDocumentsvaria in base alla versione di Windows e quando si usa il reindirizzamento delle cartelle. Inoltre, Microsoft OneDrive può modificare il percorso della cartellaDocuments. È possibile verificare la posizione dellaDocumentscartella utilizzando il seguente comando:[Environment]::GetFolderPath('MyDocuments').Nei sistemi non Windows, i
$HOME/.local/share/powershell/Modulesmoduli 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 Filescartella 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
PSModulePathnon esiste, combina CurrentUser, AllUserse i percorsi dei moduli$PSHOME - Se
PSModulePathesiste:- Se
PSModulePathcontiene il percorso dei moduli$PSHOME:- Il percorso dei moduli AllUsers è inserito prima del percorso dei moduli
$PSHOME.
- Il percorso dei moduli AllUsers è inserito prima del percorso dei moduli
- altro:
- È sufficiente usare
PSModulePathcome definito perché l'utente ha rimosso deliberatamente la posizione$PSHOME
- È sufficiente usare
- Se
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
PSModulePathdell'ambito utente - Confrontare il processo con la variabile di ambiente ereditata
PSModulePath- Se lo stesso:
- Aggiungere il AllUsers
PSModulePathalla fine seguendo la semantica della variabile di ambientePath - Il percorso di Windows
System32proviene dal computer definitoPSModulePath, quindi non deve essere aggiunto in modo esplicito
- Aggiungere il AllUsers
- Se diverso, trattare come se l'utente lo avesse modificato in modo esplicito e non accodare AllUsers
PSModulePath
- Se lo stesso:
- Prefisso con i percorsi utente, sistema e
$PSHOMEPS7 in tale ordine- Se
powershell.config.jsoncontiene unPSModulePathspecifico per l'utente, utilizzare quello invece dell'impostazione predefinita per l'utente. - Se
powershell.config.jsoncontiene unPSModulePathcon ambito a livello di sistema, usa quello al posto del valore predefinito per il sistema.
- Se
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
$PSHOMEin 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 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)