Adam the Automator

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 si conosce il trucco. I trucchi che imparerete in questo articolo funzioneranno per le variabili d’ambiente di Windows 10 così come per qualsiasi client/server Windows dopo Windows 7 SP1/Windows Server 2008.

PowerShell fornisce molti modi diversi per interagire con le variabili d’ambiente di Windows dal $env: PSDrive. il registro e la classe .NET. Imparerete a conoscere ogni metodo, compresa la comprensione dell’ambito delle variabili d’ambiente, in questa guida passo dopo passo.

Tabella dei contenuti

Presupposti

In tutto questo articolo, userò Windows PowerShell 5.1 su Windows 10. Ma se hai una qualsiasi versione di Windows PowerShell successiva alla v3 su Windows 7 SP1 o successivo, le tecniche che sto per mostrarti dovrebbero funzionare bene.

Cosa sono le variabili di ambiente?

Le variabili d’ambiente, come suggerisce il nome, memorizzano informazioni sull’ambiente utilizzato da Windows e dalle applicazioni. Le variabili d’ambiente sono accessibili da applicazioni grafiche come Windows Explorer ed editor di testo semplice come Notepad, così come da cmd.exe e PowerShell.

Utilizzare le variabili d’ambiente ti aiuta ad evitare di codificare i percorsi dei file, i nomi degli utenti o dei computer e molto altro nei tuoi script o moduli PowerShell.

Variabili d’ambiente comuni

Quando inizierai ad imparare di più su come lavorare con le variabili d’ambiente in PowerShell, incontrerai molte variabili diverse. Alcune sono più utili di altre. Qui sotto c’è una lista di alcune delle variabili d’ambiente comuni e il loro uso come riferimento.

Variabile Uso
ClientName Il nome del computer remoto connesso tramite una sessione Remote Desktop.
SessionName Questo aiuta ad identificare se la sessione corrente di Windows è considerata dal sistema operativo come in esecuzione alla console. Per le sessioni di console, SessionName sarà ‘Console’. Le connessioni Enhanced Session alle macchine virtuali Hyper-V non riportano SessionName come ‘Console’, mentre le Sessioni Standard sì.
ComputerName Il nome del computer.
SystemRoot e Windir Il percorso dell’installazione Windows corrente.
ProgramFiles e ProgramFiles(x86) Le posizioni predefinite per i programmi x64 e x86.
ProgramW6432 La posizione predefinita per i programmi, evitando il reindirizzamento 32/64 bit. Questa variabile si applica solo ai processi a 32 bit in esecuzione su una piattaforma a 64 bit. Ciò significa che è possibile utilizzarla per identificare quando un’istanza a 32 bit di PowerShell è in esecuzione su un sistema a 64 bit.
UserDNSDomain Il Fully Qualified Domain Name del dominio Active Directory a cui l’utente corrente si è collegato. Presente solo per i logon di dominio.
UserDomain Il nome in stile NETBIOS del dominio a cui l’utente corrente si è collegato. Può essere il nome di un computer se non c’è un dominio.
UserDomainRoamingProfile La posizione della copia centrale del profilo roaming per l’utente, se presente. Presente solo per i logon di dominio.
UserName Il nome dell’utente attualmente connesso.
UserProfile La posizione del profilo dell’utente corrente sul computer locale.

Scopi delle variabili d’ambiente

Ci sono tre scopi delle variabili d’ambiente. Pensate agli scopi come a strati di variabili che si accumulano per dare un quadro complessivo. Combinati, questi “strati” forniscono molte variabili d’ambiente diverse a qualsiasi processo in esecuzione in Windows.

“Gerarchia” degli scopi delle variabili d’ambiente

Ognuno di questi “strati” si combina o si sovrascrive a vicenda. Sono definiti in una gerarchia come: machine -> user -> process con ogni variabile scoped che sovrascrive la variabile genitore se ne esiste una nell’ambito genitore.

Per esempio, una comune variabile d’ambiente è TEMP. Questa variabile memorizza il percorso della cartella temporanea locale di Windows. Questa variabile d’ambiente è impostata su:

Se non c’è nessuna TEMP variabile d’ambiente impostata nell’ambito 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 di Windows in esecuzione. Qualsiasi account utente può leggerle, ma per impostarle, cambiarle o cancellarle è necessario disporre di privilegi elevati.

Utente

Le variabili d’ambiente nell’ambito utente sono associate all’utente che esegue il processo corrente. Le variabili utente sovrascrivono le variabili in ambito macchina che hanno lo stesso nome.

Nota: Microsoft raccomanda che i valori delle variabili d’ambiente in ambito macchina e utente non contengano più di 2048 caratteri.

Processo

Le variabili d’ambiente nell’ambito del processo sono una combinazione degli ambiti macchina e utente, insieme ad alcune variabili che Windows crea dinamicamente. 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 utente e una per l’ambito macchina.

Non usare il registro per gestire le variabili d’ambiente

C’è una fregatura quando si fanno modifiche alle variabili all’interno del registro. Qualsiasi processo in esecuzione non vedrà le modifiche alle variabili nel registro. I processi vedono solo le variabili di registro e i valori che erano presenti quando il processo è stato avviato, a meno che Windows non li informi che c’è stato un cambiamento.

Invece di modificare direttamente il registro, si può usare una classe .NET. La classe .NET può modificare le variabili d’ambiente della macchina e dell’utente e gestire la pulizia del registro per voi.

Modificare direttamente le variabili d’ambiente nel registro, sebbene possibile, non ha senso. La classe .NET offre un approccio più semplice, supportato da Microsoft. Imparerete ad usare la classe .NET più avanti in questo articolo.

Posizione nel registro delle variabili d’ambiente e interrogazione

Spero che siate stati convinti a non modificare direttamente il registro, ma se volete dare un’occhiata a ciò che c’è, potete trovare tutte le variabili d’ambiente dell’utente nella chiave HKEY_CURRENT_USER\Environment. Le variabili d’ambiente della macchina sono memorizzate in 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 sono espanse quando il valore viene recuperato.

Per dimostrare questo, usate l’utilità REG. Si tratta di una piccola utility a riga di comando inclusa in Windows.

Interrogate la variabile d’ambiente TEMP come visto di seguito. Esegui REG con il parametro QUERY per recuperare il valore della variabile TEMP.

> REG QUERY HKCU\Environment /V TEMPHKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp

A volte noterete che le variabili di ambiente vengono visualizzate circondate da simboli di percentuale (%COMPUTERNAME%) come sopra. Questo è il modo vecchia scuola di mostrare le variabili d’ambiente tramite cmd.exe e file batch. Sappiate che PowerShell non riconosce questo formato.

L’utilità REG ci permette di vedere il valore nativo del valore del registro. Il tipo di valore è REG_EXPAND_SZ e il valore contiene la variabile d’ambiente %USERPROFILE%.

Se preferite usare PowerShell per recuperare il valore del registro, potete farlo usando il cmdlet Get-Item come mostrato di seguito.

Visualizzare e impostare le variabili d’ambiente di Windows tramite la GUI

Per vedere una vista GUI delle variabili d’ambiente utente e di sistema, eseguite SystemPropertiesAdvanced.exe da PowerShell, un prompt dei comandi o da Windows Key+R per visualizzare la scheda System Properties Advanced. Clicca sul pulsante EnvironmentVariables, che è evidenziato nell’immagine qui sotto.

La finestra di dialogo Proprietà di sistema, scheda Avanzate

La finestra di dialogo Variabili d’ambiente, mostrata sotto, permette di visualizzare, creare e modificare le variabili d’ambiente utente e macchina. Si noti che la finestra di dialogo si riferisce alle variabili in ambito macchina come variabili di sistema.

La finestra di dialogo delle variabili d’ambiente

Ora che avete una comprensione delle variabili d’ambiente, passiamo a quello per cui siete qui, gestirle con PowerShell!

Ci sono alcuni modi diversi in cui puoi interagire con le variabili d’ambiente usando PowerShell.

  • Il Env: PSDrive e Provider – basato sulla sessione. Imposta solo i valori delle variabili d’ambiente per la sessione PowerShell corrente
  • $env: variabili – basato sulla sessione. Imposta i valori delle variabili d’ambiente solo per la sessione PowerShell corrente
  • La classe .NET – permette di persistere le variabili d’ambiente gestite dall’utente e dal sistema attraverso le sessioni e i riavvii

L’Env: PSDrive e Provider

Uno dei modi migliori per leggere le variabili d’ambiente è un concetto di PowerShell noto come unità PowerShell (unità PS). Un drive PS permette di trattare le variabili d’ambiente come se fossero un file system attraverso il drive Env:.

Passare al drive Env:

Come tutti i drive PS, vi si fa riferimento tramite percorsi come Env:\TEMPEnv:\COMPUTERNAME, ecc. Ma per risparmiare alcune sequenze di tasti, passate all’unità Env: come fareste con qualsiasi unità del file system, come mostrato di seguito.

PS51> cd Env:PS51 Env:\>## orPS51> Set-Location Env:PS Env:\>

Completamento a schede con il drive Env:

Si possono usare gli stessi comandi che si userebbero per accedere ad un file system, come Get-Item e Get-ChildItem per accedere alle variabili di ambiente. Ma invece del file system, state leggendo l’unità Env:.

Perché le variabili d’ambiente sono memorizzate in un’unità PS, potete usare la funzione di completamento della scheda di PowerShell per scorrere le variabili disponibili, come mostrato sotto.

Env: tab completion – finding environment variables starting with the letter C

Passiamo ora ad un paio di esempi di come potete usare l’unità Env: PS per lavorare con le variabili d’ambiente.

Elencare le variabili d’ambiente con Env:

PS51> Get-Item -Path Env:PS51> Get-Item -Path Env:USERNAME

Elencare le variabili d’ambiente usando un carattere jolly con Env:

PS51> Get-Item -Path Env:user*

Trovare i valori delle variabili d’ambiente con Env:

I risultati di questi comandi sono oggetti chiave/valore .NET. Questi oggetti contengono il nome della variabile d’ambiente nella proprietà Name e il valore nella proprietà Value.

È possibile accedere a un valore specifico di una variabile d’ambiente avvolgendo il riferimento al comando Get-Item tra parentesi e facendo riferimento alla proprietà Value come mostrato di seguito:

PS51> (Get-Item -Path Env:computername).ValueMYCOMPUTERHOSTNAME

In situazioni in cui è necessario restituire solo alcune variabili di ambiente, utilizzare le cmdlets 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 d’ambiente COMPUTERNAME.

PS51> Get-ChildItem -Path Env: | Where-Object -Property Name -eq 'COMPUTERNAME'

Come metodo alternativo, utilizzare il cmdlet Get-Content. Questo cmdlet restituisce un oggetto contenente il valore della variabile d’ambiente. Questo oggetto è più semplice da trattare in quanto restituisce solo il valore, piuttosto che un oggetto con Name e Value proprietà.

PS51> Get-Content -Path Env:\COMPUTERNAME

Demo: Inserire valori di ambiente in una stringa

Utilizzando Get-Content, è possibile trovare il valore di una variabile di ambiente e inserire la COMPUTERNAME variabile di ambiente, per esempio, in una stringa di testo.

PS51> 'Computer Name is: {0}' -f (Get-Content -Path Env:COMPUTERNAME)Computer Name is: MYCOMPUTER

Impostare una variabile di ambiente (e creare) con Env:

Creare nuove variabili d’ambiente con PowerShell utilizzando la cmdlet New-Item. Fornite il nome della variabile d’ambiente nella forma Env:\<EnvVarName> per il valore Name e il valore della variabile d’ambiente per il parametro Value come mostrato di seguito.

PS51> New-Item -Path Env:\MYCOMPUTER -Value MY-WIN10-PCName Value---- -----MYCOMPUTER MY-WIN10-PC

Utilizzare il cmdlet Set-item per impostare una variabile d’ambiente, o crearne una nuova se non esiste già. Potete vedere qui sotto che usando il Set-Item cmdlet, potete sia creare che modificare una variabile d’ambiente.

PS51> Set-Item -Path Env:testvariable -Value "Alpha"

Copiare una variabile d’ambiente con Env:

A volte si presenta la situazione di dover replicare il valore di una variabile d’ambiente. Puoi farlo usando la cmdlet Copy-Item.

Di seguito puoi vedere che il valore della variabile COMPUTERNAME viene copiato in MYCOMPUTER, sovrascrivendo il valore esistente.

Rimuovere una variabile d’ambiente con Env:

Si presenteranno situazioni in cui una variabile d’ambiente non è più necessaria. Puoi rimuovere le variabili d’ambiente usando uno dei tre metodi:

  • Usa il cmdlet Set-Item per impostare una variabile d’ambiente ad un valore vuoto

PS51> Set-Item -Path Env:\MYCOMPUTER -Value ''
  • Usa il cmdlet Remove-Item.
PS51> Remove-Item -Path Env:\MYCOMPUTER
  • Utilizzare il cmdlet Clear-Item.
PS51> Clear-Item -Path Env:\MYCOMPUTER

Rinominare una variabile di ambiente con Env:

In situazioni in cui il nome di una variabile d’ambiente deve essere cambiato, avete la possibilità di rinominare, piuttosto che cancellare e ricreare con il Env: provider.

Utilizzate il Rename-Item cmdlet per cambiare il nome di una variabile d’ambiente mantenendo il suo valore. Qui sotto potete vedere che la variabile MYCOMPUTER viene rinominata in OLDCOMPUTER mantenendo il suo valore.

$Env: Variabili

Avendo imparato la guida Env: per trattare le variabili d’ambiente come file, questa sezione mostra come trattarle come variabili. Un altro modo per gestire le variabili d’ambiente in sessione è usare l’Expression Parser di PowerShell. Questa funzione permette di utilizzare l’ambito $Env: per accedere alle variabili d’ambiente.

Ottenere una variabile d’ambiente con $Env:

Utilizzando l’ambito $Env, potete fare riferimento alle variabili d’ambiente direttamente senza usare un comando come Get-Item come mostrato qui sotto.

PS51> $env:computername

Questo metodo rende facile l’inserimento di variabili d’ambiente nelle stringhe come sotto:

Impostare o creare una variabile d’ambiente con $Env:

Impostare una variabile d’ambiente usando questo metodo è semplice. Questo creerà anche una nuova variabile d’ambiente se non ne esiste già una, come sotto.

PS51> $env:testvariable = "Alpha"

Utilizza la sintassi += per aggiungere un valore esistente, piuttosto che sovrascriverlo.

PS51> $env:testvariable = "Alpha"PS51> $env:testvariable += ",Beta"PS51> $env:testvariableAlpha,Beta

Rimuovere una variabile d’ambiente con $Env:

Per rimuovere una variabile d’ambiente usando questo metodo, basta impostare il suo valore su una stringa vuota.

PS51> $env:testvariable = ''

Usando la classe .NET

La classe .NET offre anche metodi per ottenere e impostare variabili d’ambiente. Questo è l’unico metodo per accedere direttamente ai vari scope d’ambiente e impostare le variabili d’ambiente che sopravvivono attraverso le sessioni di PowerShell.

In tutti i seguenti esempi, se non viene fornito alcun ambito, si assume l’ambito del processo.

Quando si usa il , si useranno alcuni diversi metodi statici di classe .NET. Non è necessario capire cosa sia un metodo statico. Dovete solo capire che per usare qualsiasi tecnica che state per imparare, dovrete prima fare riferimento alla classe () seguita da due punti (::) e poi dal metodo.

Elencare le variabili d’ambiente con

Se volete vedere tutte le variabili d’ambiente in un particolare ambito, dovete usare il metodo GetEnvironmentVariables. Questo metodo restituisce tutte le variabili d’ambiente dello scope specificato come argomento del metodo (tra parentesi).

Ottenere singole variabili d’ambiente con

Se avete bisogno di trovare una specifica variabile d’ambiente potete farlo in due modi diversi.

  • GetEnvironmentVariables().<var name> – non consigliato
  • GetEnvironmentVariable('<var name>','<scope>')

GetEnvironmentVariables()

Usando il metodo GetEnvironmentVariables(), si usa la notazione a punti per fare riferimento al valore. Racchiudete la classe e il riferimento al metodo statico tra parentesi seguite da un punto e poi dal nome della variabile d’ambiente come qui sotto:

PS51> (::GetEnvironmentVariables()).APPDATA

Nota che quando si fa riferimento a variabili d’ambiente in questo modo, bisogna assicurarsi di far corrispondere la capitalizzazione! Nell’esempio sopra, provate a fare riferimento alla variabile APPDATA usando appdata. Usate invece il GetEnvironmentVariable().

GetEnvironmentVariable()

Piuttosto che usare il metodo GetEnvironmentVariables(), usate invece GetEnvironmentVariable() per trovare singole variabili di ambiente. Questo metodo aggira il problema della capitalizzazione e permette anche di specificare l’ambito.

Per usare questo metodo, specificate il nome della variabile d’ambiente e l’ambito in cui vorreste cercare quella variabile separata da una virgola.

Impostare una variabile d’ambiente con

Utilizzate il metodo SetEnvironmentVariable() per impostare il valore di una variabile d’ambiente per l’ambito dato, o crearne una nuova se non esiste già.

Quando impostate le variabili nell’ambito del processo, troverete che l’ambito del processo è volatile mentre le modifiche agli ambiti utente e macchina sono permanenti.

Nota: Chiamando il metodo SetEnvironmentVariable con un nome o un valore di variabile di 32767 caratteri o più, verrà lanciata un’eccezione.

Rimuovere una variabile d’ambiente con

Utilizzare il metodo SetEnvironmentVariable() per rimuovere una variabile d’ambiente per l’ambito dato impostando il suo valore ad una stringa vuota.

Variabili d’ambiente utili per PowerShell

Come molte altre applicazioni Windows, PowerShell ha alcune variabili d’ambiente proprie. Due variabili d’ambiente utili da conoscere sono PSExecutionPolicyPreference e PSModulePath.

PSExecutionPolicyPreference

La variabile d’ambiente PSExecutionPolicyPreference memorizza la politica di esecuzione PowerShell corrente. Viene creata se una politica di esecuzione PowerShell specifica per la sessione è impostata da:

  • Eseguendo il Set-ExecutionPolicy cmdlet con un Scope parametro di Process
  • Eseguendo il powershell.exe eseguibile per avviare una nuova sessione, usando il parametro ExecutionPolicy della linea di comando per impostare una politica per la sessione.

PSModulePath

La variabile d’ambiente PSModulePath contiene il percorso che PowerShell cerca per i moduli se non si specifica un percorso completo. È formata in modo molto simile alla variabile d’ambiente standard PATH, con i percorsi delle singole directory separati da un punto e virgola.

PS51> $env:PSModulePathC:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

Suggerimento veloce: dividete ogni cartella per ottenere un array di stringhe per elaborare ogni percorso individualmente usando $env:PSModulePath.split(‘;’)

Riassunto

Le variabili d’ambiente sono un metodo utile per ottenere informazioni su un sistema in esecuzione, o per memorizzare informazioni attraverso sessioni e riavvii. Sia che stiate semplicemente leggendo le variabili d’ambiente di default del sistema operativo Windows, sia che ne stiate creando di vostre, ora potete gestirle in vari modi con PowerShell!

Ulteriori letture

  • about_Environment_Variables
  • La classe .NET su Microsoft docs
  • Impara il formato stringa di PowerShell e le stringhe espandibili

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *