Sulle variabili d’ambiente
- 09/22/2020
- 8 minuti per leggere
-
- S
- r
- s
- d
- c
-
+1
Descrizione breve
Descrive come accedere alle variabili di ambiente Windows in PowerShell.
Descrizione lunga
Le variabili d’ambiente memorizzano informazioni sull’ambiente del sistema operativo. Queste informazioni includono dettagli come il percorso del sistema operativo, il numero di processori usati dal sistema operativo e la posizione delle cartelle temporanee.
Le variabili d’ambiente memorizzano dati usati dal sistema operativo e da altri programmi. Per esempio, la variabile d’ambiente WINDIR
contiene la posizione della directory di installazione di Windows. I programmi possono interrogare il valore di questa variabile per determinare dove si trovano i file del sistema operativo Windows.
PowerShell può accedere e gestire le variabili d’ambiente in qualsiasi piattaforma di sistema operativo supportata. Il provider di ambiente PowerShell semplifica questo processo rendendo facile la visualizzazione e la modifica delle variabili d’ambiente.
Le variabili d’ambiente, a differenza di altri tipi di variabili in PowerShell, sono ereditate dai processi figli, come i lavori locali in background e le sessioni in cui vengono eseguiti i membri del modulo. Questo rende le variabili d’ambiente ben adatte a memorizzare valori che sono necessari sia nei processi genitori che in quelli figli.
Utilizzare e cambiare le variabili d’ambiente
Su Windows, le variabili d’ambiente possono essere definite in tre scopi:
- Scopo macchina (o sistema)
- Scopo utente
- Scopo processo
Lo scopo processo contiene le variabili d’ambiente disponibili nel processo corrente, o sessione PowerShell. Questa lista di variabili è ereditata dal processo padre ed è costruita dalle variabili negli scope Machine e User. Le piattaforme basate su Unix hanno solo l’ambito Process.
Puoi visualizzare e cambiare i valori delle variabili d’ambiente senza usare acmdlet usando una sintassi di variabile con il fornitore dell’ambiente. Per visualizzare il valore di una variabile d’ambiente, usa la seguente sintassi:
$Env:<variable-name>
Ad esempio, per visualizzare il valore della variabile d’ambiente WINDIR
, digita il seguente comando al prompt dei comandi PowerShell:
$Env:windir
In questa sintassi, il simbolo del dollaro ($
) indica una variabile, e il nome dell’unità(Env:
) indica una variabile di ambiente seguita dal nome della variabile(windir
).
Quando si cambiano le variabili d’ambiente in PowerShell, il cambiamento riguarda solo la sessione corrente. Questo comportamento assomiglia a quello del comando Set
nella Command Shell di Windows e del comando Setenv
negli ambienti UNIX. Per cambiare i valori negli scopi Machine o User, è necessario utilizzare i metodi della classe System.Environment.
Per apportare modifiche alle variabili Machine-scope, è necessario avere anche il permesso. Se provi a cambiare un valore senza sufficienti permessi, il comando fallisce e PowerShell visualizza un errore.
Puoi cambiare i valori delle variabili senza usare un cmdlet usando la seguente sintassi:
$Env:<variable-name> = "<new-value>"
Ad esempio, per aggiungere ;c:\temp
al valore della Path
variabile ambiente, usa la seguente sintassi:
$Env:Path += ";c:\temp"
Su Linux o macOS, i due punti (:
) nel comando separano il nuovo percorso dal percorso che lo precede nella lista.
$Env:PATH += ":/usr/local/temp"
Si possono anche usare le cmdlets Item, come Set-Item
Remove-Item
, eCopy-Item
per cambiare i valori delle variabili di ambiente. Per esempio, per usare la cmdlet Set-Item
per aggiungere ;c:\temp
al valore della variabile d’ambiente Path
, usate la seguente sintassi:
Set-Item -Path Env:Path -Value ($Env:Path + ";C:\Temp")
In questo comando, il valore è racchiuso tra parentesi in modo che venga interpretato come unità.
Variabili d’ambiente che memorizzano le preferenze
Le funzioni di PowerShell possono usare variabili d’ambiente per memorizzare le preferenze dell’utente. Queste variabili funzionano come le variabili di preferenza, ma sono ereditate dalle sessioni figlio delle sessioni in cui sono create. Per maggiori informazioni sulle variabili di preferenza, vedi about_preference_variables.
Le variabili d’ambiente che memorizzano le preferenze includono:
-
PSExecutionPolicyPreference
Memorizza il criterio di esecuzione impostato per la sessione corrente. Questa variabile d’ambiente esiste solo quando si imposta un criterio d’esecuzione per una singola sessione.Si può fare in due modi diversi.
-
Avviare una sessione dalla riga di comando usando il parametro ExecutionPolicy per impostare il criterio d’esecuzione per la sessione.
-
Utilizzare il
Set-ExecutionPolicy
cmdlet. Usa il parametro Scope con un valore di “Process”.Per maggiori informazioni, vedi about_Execution_Policies.
-
-
PSModuleAnalysisCachePath
PowerShell fornisce il controllo sul file che viene utilizzato per la cache dei dati sui moduli e i loro cmdlet. La cache viene letta all’avvio durante la ricerca di un comando e viene scritta su un thread in background qualche volta dopo che un modulo è importato.
La posizione predefinita della cache è:
- Windows PowerShell 5.1:
$env:LOCALAPPDATA\Microsoft\Windows\PowerShell
- PowerShell 6.0 e superiori:
$env:LOCALAPPDATA\Microsoft\PowerShell
- Non-Windows default:
~/.cache/powershell
Il nome del file predefinito per la cache è
ModuleAnalysisCache
. Quando hai installato più istanze di PowerShell, il nome del file include un suffisso esadecimale in modo che ci sia un unico nome del file per ogni installazione.Nota
Se il rilevamento dei comandi non funziona correttamente, per esempio Intellisenses mostra comandi che non esistono, puoi cancellare il file della cache. La cache viene ricreata al prossimo avvio di PowerShell.
Per cambiare la posizione predefinita della cache, imposta la variabile d’ambiente prima di avviare PowerShell. Le modifiche a questa variabile d’ambiente hanno effetto solo sui processi dei bambini. Il valore dovrebbe nominare un percorso completo (incluso il nome del file) che PowerShell ha il permesso di creare e scrivere file.
Per disabilitare la cache dei file, impostare questo valore su una posizione non valida, ad esempio:
# `NUL` here is a special device on Windows that cannot be written to,# on non-Windows you would use `/dev/null`$env:PSModuleAnalysisCachePath = 'NUL'
Questo imposta il percorso sul dispositivo NUL. PowerShell non può scrivere sul percorso ma non viene restituito alcun errore. Puoi vedere gli errori riportati usando atracer:
Trace-Command -PSHost -Name Modules -Expression { Import-Module Microsoft.PowerShell.Management -Force }
- Windows PowerShell 5.1:
-
PSDisableModuleAnalysisCacheCleanup
Quando si scrive la cache di analisi dei moduli, PowerShell controlla i moduli che non esistono più per evitare una cache inutilmente grande. A volte questi controlli non sono desiderabili, nel qual caso è possibile disattivarli impostando il valore di questa variabile d’ambiente su
1
.L’impostazione di questa variabile d’ambiente ha effetto immediato nel processo corrente.
-
PSModulePath
La variabile d’ambiente
$env:PSModulePath
contiene una lista di posizioni delle cartelle che vengono cercate per trovare moduli e risorse.Di default, le posizioni effettive assegnate a
$env:PSModulePath
sono:-
Locazioni di sistema: Queste cartelle contengono i moduli che vengono forniti con PowerShell. I moduli sono memorizzati nella posizione
$PSHOME\Modules
. Inoltre, questa è la posizione in cui sono installati i moduli di gestione di Windows. -
Moduli installati dall’utente: Questi sono moduli installati dall’utente.
Install-Module
ha un parametro Scope che permette di specificare se il modulo è installato per l’utente corrente o per tutti gli utenti. Per maggiori informazioni, vedi Install-Module.- Su Windows, la posizione dell’ambito CurrentUser specifico dell’utente è la cartella
$HOME\Documents\PowerShell\Modules
. La posizione dell’ambito AllUsers è$env:ProgramFiles\PowerShell\Modules
. - Sui sistemi non Windows, la posizione dell’ambito CurrentUserscope specifico dell’utente è la cartella
$HOME/.local/share/powershell/Modules
. La posizione dell’ambito AllUsers è/usr/local/share/powershell/Modules
.
- Su Windows, la posizione dell’ambito CurrentUser specifico dell’utente è la cartella
Inoltre, i programmi di setup che installano moduli in altre directory, come la directory Program Files, possono aggiungere le loro posizioni al valore di
$env:PSModulePath
.Per maggiori informazioni, vedere about_PSModulePath.
-
Gestire le variabili d’ambiente
PowerShell fornisce diversi metodi per gestire le variabili d’ambiente.
- L’unità provider Environment
- I cmdlets Item
- La classe .NET System.Environment
- Su Windows, il Pannello di Controllo del Sistema
Utilizzando il provider Environment
Ogni variabile d’ambiente è rappresentata da un’istanza della classe System.Collections.DictionaryEntry. In ogni oggetto DictionaryEntry, il nome della variabile d’ambiente è la chiave del dizionario. Il valore della variabile è il valore del dizionario.
Per visualizzare le proprietà e i metodi dell’oggetto che rappresenta una variabile d’ambiente in PowerShell, usate la cmdlet Get-Member
. Ad esempio, per visualizzare i metodi e le proprietà di tutti gli oggetti nell’unità Env:
, digitare:
Get-Item -Path Env:* | Get-Member
Il fornitore di ambiente PowerShell consente di accedere alle variabili di ambiente in un’unità PowerShell (l’unità Env:
). Questo drive assomiglia molto a un drive del file system. Per andare sul drive Env:
, digitate:
Set-Location Env:
Utilizzate le cmdlets Content per ottenere o impostare i valori di una variabile di ambiente.
PS Env:\> Set-Content -Path Test -Value 'Test value'PS Env:\> Get-Content -Path TestTest value
Puoi visualizzare le variabili d’ambiente nell’unità Env:
da qualsiasi altra unità PowerShell, e puoi andare nell’unità Env:
per visualizzare e cambiare le variabili d’ambiente.
Utilizzando le cmdlets
Quando si fa riferimento a una variabile d’ambiente, digitare il nome dell’unità Env:
seguito dal nome della variabile. Per esempio, per visualizzare il valore dellaCOMPUTERNAME
variabile d’ambiente, digitate:
Get-ChildItem Env:Computername
Per visualizzare i valori di tutte le variabili d’ambiente, digitate:
Get-ChildItem Env:
Perché le variabili d’ambiente non hanno elementi figli, l’output di Get-Item
e Get-ChildItem
è lo stesso.
Di default, PowerShell visualizza le variabili d’ambiente nell’ordine in cui le recupera. Per ordinare l’elenco delle variabili d’ambiente per nome della variabile, convogliare l’output di un comando Get-ChildItem
al comando Sort-Object
cmdlet. Per esempio, da qualsiasi unità PowerShell, digitate:
Get-ChildItem Env: | Sort Name
Potete anche andare nell’unità Env:
usando il Set-Location
cmdlet:
Set-Location Env:
Quando siete nell’unità Env:
, potete omettere il nome dell’unità Env:
dal percorso. Per esempio, per visualizzare tutte le variabili d’ambiente, digitate:
PS Env:\> Get-ChildItem
Per visualizzare il valore della variabile COMPUTERNAME
dall’interno del Env:
drive, digitate:
PS Env:\> Get-ChildItem ComputerName
Salvare le modifiche alle variabili d’ambiente
Per effettuare una modifica persistente a una variabile d’ambiente su Windows, utilizzare il Pannello di controllo del sistema. Selezionare Impostazioni di sistema avanzate. Nella scheda Avanzate, fai clic su Variabile d’ambiente…. Puoi aggiungere o modificare le variabili d’ambiente esistenti negli scopi Utente e Sistema (Macchina). Windows scrive questi valori nel Registro di sistema in modo che persistano attraverso le sessioni e i riavvii del sistema.
In alternativa, puoi aggiungere o cambiare le variabili d’ambiente nel tuo profilo PowerShell. Questo metodo funziona per qualsiasi versione di PowerShell su qualsiasi piattaforma supportata.
Utilizzando i metodi System.Environment
La classe System.Environment fornisce i metodi GetEnvironmentVariable e SetEnvironmentVariable che ti permettono di specificare l’ambito della variabile.
L’esempio seguente usa il metodo GetEnvironmentVariable per ottenere l’impostazione di PSModulePath
e il metodo SetEnvironmentVariable per aggiungere il percorso C:\Program Files\Fabrikam\Modules
al valore.
$path = ::GetEnvironmentVariable('PSModulePath', 'Machine')$newpath = $path + ';C:\Program Files\Fabrikam\Modules'::SetEnvironmentVariable("PSModulePath", $newpath, 'Machine')
Per maggiori informazioni sui metodi della classe System.Environment, vedereMetodiAmbiente.
Si veda anche
- Ambiente (provider)
- about_Modules