Articles

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-ItemRemove-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 }
  • 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.

    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-Iteme 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

Lascia un commento

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