Utilizzare PowerShell per impostare le variabili d’ambiente di Windows, leggere le variabili d’ambiente e creare nuove variabili d’ambiente è facile una volta che conosci il trucco. I trucchi che imparerai in questo articolo funzioneranno per le variabili d’ambiente di Windows 10 e per qualsiasi client/server Windows successivo a Windows 7 SP1/Windows Server 2008.
PowerShell offre molti modi diversi per interagire con le variabili d’ambiente di Windows utilizzando il PSDrive $env:
, il registro di sistema e la classe .NET [System.Environment]
. Imparerai su ciascun metodo, compreso il comprendere la portata delle variabili d’ambiente, in questa guida passo passo.
Presupposti
In tutto questo articolo, userò Windows PowerShell 5.1 su Windows 10. Ma se hai una versione di Windows PowerShell successiva alla v3 su Windows 7 SP1 o successivo, le tecniche che sto per mostrarti dovrebbero funzionare senza problemi.
Cosa sono le Variabili d’Ambiente?
Le variabili d’ambiente, come suggerisce il nome, memorizzano informazioni sull’ambiente utilizzato da Windows e dalle applicazioni. Le variabili d’ambiente possono essere accedute da applicazioni grafiche come Windows Explorer e editor di testo semplici come Notepad, così come da cmd.exe e PowerShell.
L’utilizzo delle variabili d’ambiente ti aiuta ad evitare di codificare manualmente percorsi dei file, nomi utente o computer e molto altro nei tuoi script o moduli PowerShell.
Comuni Variabili d’Ambiente
Man mano che inizi a imparare di più su come lavorare con le variabili d’ambiente in PowerShell, ti imbatterai in molte variabili diverse. Alcune sono più utili di altre. Di seguito è riportato un elenco di alcune delle comuni variabili d’ambiente e il loro utilizzo a scopo di riferimento.
Variable | Usage |
---|---|
ClientName | The name of the remote computer connected via a Remote Desktop session. |
SessionName | This helps to identify if the current Windows session is regarded by the operating system as running at the console. For console sessions SessionName will be ‘Console’. Enhanced Session connections to Hyper-V Virtual Machines do not report SessionName as ‘Console’, whereas Standard Sessions do. |
ComputerName | The name of the computer. |
SystemRoot and Windir | The path to the current Windows installation. |
ProgramFiles and ProgramFiles(x86) | The default locations for x64 and x86 programs. |
ProgramW6432 | The default location for programs, avoiding 32/64 bit redirection. This variable only applies for 32 bit processes running on a 64 bit platform. This means that you can use it to identify when a 32 bit instance of PowerShell is running on a 64 bit system. |
UserDNSDomain | The Fully Qualified Domain Name of the Active Directory domain that the current user logged on to. Only present for domain logons. |
UserDomain | The NETBIOS-style name of the domain that the current user logged on to. Can be a computer name if there’s no domain. |
UserDomainRoamingProfile | The location of the central copy of the roaming profile for the user, if any. Only present for domain logons. |
UserName | The name of the currently logged on user. |
UserProfile | The location of the profile of the current user on the local computer. |
Scope delle Variabili d’Ambiente
Ci sono tre scope delle variabili d’ambiente. Pensa agli scope come a livelli di variabili che si accumulano per fornire un quadro completo. Combinati, questi “livelli” forniscono molte diverse variabili d’ambiente a qualsiasi processo in esecuzione in Windows.
“Gerarchia” dello Scope delle Variabili d’Ambiente
Ciascuno di questi “livelli” si combina o sovrascrive l’altro. Sono definiti in una gerarchia come: macchina -> utente -> processo con ogni variabile di scope sovrascrivendo la variabile genitore se esiste nello scope genitore.
Ad esempio, una comune variabile d’ambiente è TEMP
. Questa variabile memorizza il percorso della cartella temporanea locale di Windows. Questa variabile d’ambiente è impostata su:
C:\WINDOWS\TEMP
in the machine scopeC:\Users\<username>\AppData\Local\Temp
in the user scopeC:\Users\<username>\AppData\Local\Temp
in the process scope.
Se non esiste una variabile d’ambiente TEMP
impostata nello scope utente, il risultato finale sarà C:\WINDOWS\TEMP
.
Tipi di Scope delle Variabili d’Ambiente
Ci sono tre diversi scope delle variabili d’ambiente in Windows.
Macchina
Le variabili d’ambiente nello scope macchina sono associate all’istanza in esecuzione di Windows. Qualsiasi account utente può leggere queste variabili, ma impostarle, modificarle o eliminarle richiede privilegi elevati.
Utente
Le variabili d’ambiente nell’ambito dell’utente sono associate all’utente che sta eseguendo il processo corrente. Le variabili dell’utente sovrascrivono le variabili con lo stesso nome nell’ambito della macchina.
Nota: Microsoft consiglia che i valori delle variabili d’ambiente a livello di Macchina e Utente non contengano più di 2048 caratteri.
Processo
Le variabili d’ambiente nell’ambito del processo sono una combinazione degli ambiti della macchina e dell’utente, insieme a alcune variabili che Windows crea dinamicamente.
Di seguito è presentata una lista di variabili d’ambiente disponibili per un processo in esecuzione. Tutte queste variabili sono create dinamicamente.
ALLUSERSPROFILE
APPDATA
COMPUTERNAME
HOMEDRIVE
HOMEPATH
LOCALAPPDATA
LOGONSERVER
PROMPT
PUBLIC
SESSION
SystemDrive
SystemRoot
USERDNSDOMAIN
USERDOMAIN
USERDOMAIN_ROAMINGPROFILE
USERNAME
USERPROFILE
Variabili d’ambiente nel Registro
Le variabili d’ambiente sono memorizzate in due posizioni del registro, una per l’ambito dell’utente e una per l’ambito della macchina.
Non utilizzare il registro per gestire le variabili d’ambiente
C’è una limitazione quando si apportano modifiche alle variabili all’interno del registro. I processi in esecuzione non vedranno le modifiche alle variabili nel registro. I processi vedono solo le variabili e i valori del registro presenti al momento dell’avvio del processo, a meno che Windows non li informi di una modifica.
Invece di modificare direttamente il registro, è possibile utilizzare una classe .NET. La classe .NET [System.Environment]
può modificare le variabili d’ambiente a livello di macchina e utente e gestire le operazioni di pulizia nel registro per voi.
Modificare le variabili d’ambiente direttamente nel registro, sebbene possibile, non ha senso. La classe .NET offre un approccio più semplice e supportato da Microsoft. Imparerai come utilizzare la classe .NET [System.Environment]
più avanti in questo articolo.
Posizioni del registro delle variabili d’ambiente e interrogazione
I hope you’ve been convinced to not modify the registry directly but if you’d like to take a peek at what’s in there, you can find all user environment variables in the HKEY_CURRENT_USER\Environment
key. Machine-scoped environment variables are stored at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
All’interno di una di queste chiavi si trovano valori di registro di tipo REG_SZ
o REG_EXPAND_SZ
. I valori REG_EXPAND_SZ
contengono variabili d’ambiente incorporate come parte del loro valore. Queste variabili d’ambiente vengono espandere quando il valore viene recuperato.
Per dimostrarlo, utilizza l’utilità REG
. Si tratta di una piccola utility a riga di comando inclusa in Windows.
Interroga la variabile di ambiente TEMP
come mostrato di seguito. Esegui REG
con il parametro QUERY
per recuperare il valore della variabile TEMP
.
A volte noterai le variabili di ambiente visualizzate tra simboli di percentuale (
%COMPUTERNAME%
) come sopra. Questo è il modo vecchio stile di mostrare le variabili di ambiente tramite cmd.exe e file batch. Sappi che PowerShell non riconosce questo formato.
Il programma di utilità REG
ci consente di visualizzare il valore nativo della chiave del registro. Il tipo di valore è REG_EXPAND_SZ
e il valore contiene la variabile di ambiente %USERPROFILE%
.
Se preferisci utilizzare PowerShell per recuperare il valore del registro, puoi farlo utilizzando il cmdlet Get-Item
come mostrato di seguito.
Visualizza e imposta le variabili di ambiente di Windows tramite l’interfaccia grafica
Per visualizzare una vista GUI delle variabili di ambiente dell’utente e di sistema, esegui SystemPropertiesAdvanced.exe da PowerShell, un prompt dei comandi o premendo Windows Key+R per visualizzare la scheda Impostazioni di sistema avanzate. Fai clic sul pulsante Variabili di ambiente, che è evidenziato nell’immagine qui sotto.

La finestra di dialogo Variabili di ambiente, mostrata di seguito, consente di visualizzare, creare e modificare le variabili di ambiente dell’utente e del computer. Nota che la finestra di dialogo si riferisce alle variabili di ambito del computer come Variabili di sistema.

Ora che hai compreso le variabili di ambiente, passiamo a ciò per cui sei qui, la loro gestione con PowerShell!
Ci sono diversi modi per interagire con le variabili d’ambiente usando PowerShell.
- Il PSDrive e il Provider
Env:
– basato sulla sessione. Imposta solo i valori delle variabili d’ambiente per la sessione corrente di PowerShell - Le variabili
$env:
– basato sulla sessione. Imposta solo i valori delle variabili d’ambiente per la sessione corrente di PowerShell - La classe .NET
[System.Environment]
– consente di persistere le variabili d’ambiente a livello utente e a livello di sistema tra sessioni e riavvii
Il PSDrive e il Provider Env:
Uno dei modi migliori per leggere le variabili d’ambiente è un concetto di PowerShell noto come “PowerShell drives” (PS drives). Un PS drive ti permette di trattare le variabili d’ambiente come se fossero un file system attraverso il drive Env:
.
Passaggio al drive Env:
Come tutti i PS drives, lo si fa riferimento tramite percorsi come Env:\TEMP
, Env:\COMPUTERNAME
, ecc. Ma per risparmiare qualche battitura, passa al drive Env:
proprio come faresti con un qualsiasi altro drive di file system, come mostrato di seguito.
Completamento automatico con il drive Env:
Puoi utilizzare gli stessi comandi che utilizzeresti per accedere al file system, come Get-Item
e Get-ChildItem
per accedere alle variabili di ambiente. Ma invece del file system, stai leggendo il drive Env:
.
Poiché le variabili di ambiente sono memorizzate in un drive di PowerShell, puoi utilizzare la funzione di completamento automatico di PowerShell per ciclare tra le variabili disponibili, come mostrato di seguito.

Andiamo ora a vedere un paio di esempi su come puoi utilizzare il drive Env:
di PowerShell per lavorare con le variabili di ambiente.
Elencazione delle variabili di ambiente con Env:
Elencazione delle variabili di ambiente utilizzando un carattere jolly con Env:
Trovare i valori delle variabili di ambiente con Env:
I risultati di questi comandi sono oggetti .NET [System.Collections.DictionaryEntry]
che contengono il nome della variabile di ambiente nella proprietà Name
e il valore nella proprietà Value
.
Puoi accedere a un valore specifico di una variabile di ambiente avvolgendo il riferimento al comando Get-Item
tra parentesi e facendo riferimento alla proprietà Value
come mostrato di seguito:
Nei casi in cui è necessario restituire solo determinate variabili di ambiente, utilizzare i cmdlet standard di PowerShell come Select-Object
e Where-Object
per selezionare e filtrare gli oggetti restituiti dal provider Env:
.
Nell’esempio seguente, viene restituita solo la variabile di ambiente COMPUTERNAME
.
Come metodo alternativo, utilizzare il cmdlet Get-Content
. Questo cmdlet restituisce un oggetto [String]
contenente il valore della variabile di ambiente. Questo oggetto è più semplice da gestire in quanto restituisce solo il valore, anziché un oggetto con le proprietà Name
e Value
.
Demo: Inserimento di valori di ambiente in una stringa
Utilizzando Get-Content
, è possibile trovare il valore di una variabile di ambiente e inserire ad esempio la variabile di ambiente COMPUTERNAME
in una stringa di testo.
Impostazione di una variabile di ambiente (e creazione) con Env:
Creare nuove variabili di ambiente con PowerShell utilizzando il cmdlet New-Item
. Specificare il nome della variabile di ambiente nella forma Env:\<NomeVarAmbiente>
per il valore Name
e il valore della variabile di ambiente per il parametro Value
come mostrato di seguito.
Utilizza il cmdlet Set-Item
per impostare una variabile di ambiente o crearne una nuova se non esiste già. Come puoi vedere di seguito, utilizzando il cmdlet Set-Item
, puoi creare o modificare una variabile di ambiente.
Copia di una variabile di ambiente con Env:
A volte si verifica la situazione in cui è necessario replicare il valore di una variabile di ambiente. Puoi farlo utilizzando il cmdlet Copy-Item
.
Di seguito puoi vedere che il valore della variabile COMPUTERNAME
viene copiato in MYCOMPUTER
, sovrascrivendo il suo valore esistente.
Rimozione di una variabile di ambiente con Env:
Si presenteranno situazioni in cui una variabile di ambiente non sarà più necessaria. Puoi rimuovere le variabili di ambiente utilizzando uno dei tre metodi:
- Utilizza il cmdlet
Set-Item
per impostare una variabile di ambiente con un valore vuoto
- Utilizza il cmdlet
Remove-Item
.
- Utilizza il cmdlet
Clear-Item
.
Rinominare una variabile di ambiente con Env:
In situazioni in cui è necessario cambiare il nome di una variabile di ambiente, hai la possibilità di rinominarla anziché eliminarla e ricrearla con il provider Env:
.
Usa il cmdlet Rename-Item
per cambiare il nome di una variabile di ambiente mantenendone il valore. Di seguito puoi vedere che la variabile MYCOMPUTER
viene rinominata in OLDCOMPUTER
mantenendo il suo valore.
$Env:
Variabili
Dopo aver padroneggiato il driver Env:
per trattare le variabili di ambiente come file, in questa sezione ti mostriamo come trattarle come variabili. Un altro modo per gestire le variabili di ambiente durante la sessione è utilizzare il PowerShell Expression Parser. Questa funzionalità ti consente di utilizzare lo scope $Env:
per accedere alle variabili di ambiente.
Ottenere una variabile di ambiente con $Env:
Utilizzando lo scope $Env
, puoi fare riferimento direttamente alle variabili di ambiente senza utilizzare un comando come Get-Item
come mostrato di seguito.
Questo metodo rende facile inserire le variabili di ambiente nelle stringhe come mostrato di seguito:
Impostare o creare una variabile di ambiente con $Env:
Impostare una variabile di ambiente utilizzando questo metodo è semplice. Questo creerà anche una nuova variabile di ambiente se non esiste già, come mostrato di seguito.
Usa la sintassi +=
per aggiungere a un valore esistente anziché sovrascriverlo.
Rimuovere una variabile di ambiente con $Env:
Per rimuovere una variabile di ambiente utilizzando questo metodo, basta impostarne il valore su una stringa vuota.
Utilizzando la classe .NET [System.Environment]
La classe .NET [System.Environment]
offre anche metodi per ottenere e impostare le variabili di ambiente. Questo è l’unico metodo per accedere direttamente a variabili di ambiente in diversi ambiti e impostare variabili di ambiente che persistono tra le sessioni di PowerShell.
In tutti gli esempi seguenti, se non viene specificato alcun ambito, si assume l’ambito del processo.
Quando si utilizza la classe [System.Environment]
, si utilizzano alcuni diversi metodi della classe statica .NET.NET static class. Non è necessario capire cosa sia un metodo statico. È sufficiente capire che per utilizzare una delle tecniche che si sta per imparare, è necessario fare riferimento prima alla classe ([System.Environment]
), seguita da due due punti (::
) e quindi dal metodo.
Elenco delle variabili di ambiente con [System.Environment]
Se si desidera visualizzare tutte le variabili di ambiente in un determinato ambito, è possibile utilizzare il metodo GetEnvironmentVariables
. Questo metodo restituisce tutte le variabili di ambiente specificate come argomento del metodo (tra parentesi).
Ottenimento di singole variabili di ambiente con [System.Environment]
Se è necessario trovare una specifica variabile di ambiente, è possibile farlo in due modi diversi.
GetEnvironmentVariables().<nome variabile>
– non consigliatoGetEnvironmentVariable('<nome variabile>','<ambito>')
GetEnvironmentVariables()
Utilizzando il metodo GetEnvironmentVariables()
, si utilizza la notazione punto per accedere al valore. Incapsula la classe [System.Environment]
e il riferimento al metodo statico tra parentesi, seguito da un punto e dal nome della variabile di ambiente come mostrato di seguito:
Nota che quando si fa riferimento alle variabili di ambiente in questo modo, è necessario assicurarsi di rispettare le maiuscole/minuscole! Nell’esempio sopra, prova a fare riferimento alla variabile
APPDATA
utilizzandoappdata
. Utilizza invece il metodoGetEnvironmentVariable()
.
GetEnvironmentVariable()
Invece di utilizzare il metodo GetEnvironmentVariables()
, utilizza il metodo GetEnvironmentVariable()
per trovare singole variabili di ambiente. Questo metodo risolve il problema delle maiuscole/minuscole e ti consente anche di specificare l’ambito.
Per utilizzare questo metodo, specifica il nome della variabile di ambiente e l’ambito in cui desideri cercare quella variabile separati da una virgola.
Impostare una variabile di ambiente con [System.Environment]
Utilizza il metodo SetEnvironmentVariable()
per impostare il valore di una variabile di ambiente per l’ambito specificato, o crearne una nuova se non esiste già.
Quando si impostano le variabili nello scope del processo, si noterà che lo scope del processo è volatile mentre le modifiche agli scope dell’utente e della macchina sono permanenti.
Nota: Chiamare il metodo SetEnvironmentVariable con un nome o un valore di variabile di 32767 caratteri o più causerà l’eccezione.
Rimuovere una variabile d’ambiente con [System.Environment]
Utilizzare il metodo SetEnvironmentVariable() per rimuovere una variabile d’ambiente per lo scope specificato impostando il suo valore su una stringa vuota.
Variabili d’ambiente PowerShell utili
Come molte altre applicazioni Windows, PowerShell ha alcune variabili d’ambiente proprie. Due utili variabili d’ambiente da conoscere sono PSExecutionPolicyPreference
e PSModulePath
.
PSExecutionPolicyPreference
La variabile d’ambiente PSExecutionPolicyPreference
memorizza la policy di esecuzione corrente di PowerShell. Viene creata se una policy di esecuzione specifica della sessione è impostata tramite:
- Esecuzione del cmdlet Set-ExecutionPolicy con un parametro Scope pari a Process
- Esecuzione dell’eseguibile powershell.exe per avviare una nuova sessione, utilizzando il parametro della riga di comando ExecutionPolicy per impostare una policy per la sessione.
PSModulePath
La variabile di ambiente PSModulePath
contiene il percorso che PowerShell cerca per i moduli se non si specifica un percorso completo. È formato in modo simile alla variabile di ambiente standard PATH
, con percorsi di directory separati da un punto e virgola.
Suggerimento rapido: dividere ogni cartella per ottenere una matrice di stringhe per elaborare singolarmente ogni percorso usando $env:PSModulePath.split(‘;’)
Riepilogo
Le variabili di ambiente sono un metodo utile per ottenere informazioni su un sistema in esecuzione o per archiviare informazioni tra sessioni e riavvii. Che tu stia semplicemente leggendo le variabili di ambiente predefinite del sistema operativo Windows e creando le tue, ora puoi gestirle in diversi modi con PowerShell!
Per ulteriori informazioni
- about_Environment_Variables
- La classe .NET [System.Environment] su Microsoft docs
- Impara il formato delle stringhe di PowerShell e l’espansione delle stringhe
Source:
https://adamtheautomator.com/powershell-environment-variables/