Ricarica il percorso in PowerShell


145

Se ho un'istanza di PowerShell ISE in esecuzione e installo qualcosa che modifica il PERCORSO o lo modifico in qualsiasi modo al di fuori di PowerShell, allora ho bisogno di riavviare PowerShell affinché possa vedere la variabile PATH aggiornata.

Esiste un modo per ricaricare il percorso da PowerShell senza riavviarlo?

Risposte:


207

Giusto per mettere in luce il commento di Rob :

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 

3
Sì. Il commento di Rob scuote la Powershell Casbah, in effetti.
Cecil Curry,

24
Se stai usando cioccolatoso, ed è caricato nel tuo profilo, c'è un comando più semplice: refreshenv. Questo fondamentalmente esegue una versione più elaborata del commento di Rob.
Kumarharsh,

ho trascorso molto tempo a cercare di capire cosa dovevo fare dato che sono un nocciolo di PowerShell. Stava cambiando il percorso come un matto e questo è esattamente quello di cui avevo bisogno. +1
cr1pto

prima, sto usando cioccolata ... ma refreshenvnon ha funzionato. La risposta qui ("Robs Comment") ha funzionato bene. Quindi, potrebbero esserci alcune situazioni in cui un approccio funziona e l'altro non ...
3z33etm

3
se stai installando Chocolatey stesso e altre app tramite Chocolatey sullo stesso script che modifica la variabile PATH, refreshenvnon funzionerà. Le refreshenvuniche opere in conchiglie subseqent aperto.
Frank Fu

72

Prova a ottenere il percorso della macchina e assegnarlo al percorso della sessione.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")

53
Grazie che ha funzionato! Ho anche avuto una variabile di ambiente utente denominata percorso, quindi ho dovuto fare questo: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Path", "User")
rob

24

Il modo più semplice, utilizzare Chocolatey (freeware). Funziona sia con CMD che con PowerShell. Quindi sarai in grado di ricaricare il PERCORSO (con espansione variabile) con un semplice comando:

refreshenv

Installazione da cmd (richiede i diritti di amministratore):

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

Esempio di utilizzo:

> SET JAVA_HOME=c:/java/jdk6
> SET PATH=%JAVA_HOME%/bin
> ECHO %PATH%
c:/java/jdk6/bin

> SET JAVA_HOME=c:/java/jdk8
> refreshenv
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..
> echo %PATH%
c:/java/jdk8/bin

9
refreshenvnon ha funzionato per me (Windows 10). Ho dovuto ancora aprire una nuova finestra affinché abbia effetto.
Peter Mortensen,

1
L'ho testato e utilizzato esattamente su Windows 10, mi è abbastanza utile. L'esempio di utilizzo che ho fatto non è preparato, è la stampa dalla mia console. Forse nel tuo caso è arrivato un tipo di conflitto tra utente e variabili di sistema? Inoltre, come ho notato, in multiconsole env (come Conemu) influisce solo sulla console corrente.
Arkadiusz Przechodzki,

refreshenvanche qui non funziona. Lavorare su alcuni script in un ambiente Windows Sandbox e il percorso si rifiuta di essere aggiornato a meno che non venga avviata una nuova sessione PS.
Reece Mercer,

6

Sulla base della risposta di mpen , ecco una funzione di PowerShell:

function refresh-path {
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") +
                ";" +
                [System.Environment]::GetEnvironmentVariable("Path","User")
}

Quindi chiama refresh-path.


3

Se il tuo percorso contiene variabili di ambiente che non sono state definite all'inizio della sessione, ti consigliamo di espandere anche quelle:

$env:Path = [System.Environment]::ExpandEnvironmentVariables([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))

Per me questo è stato utile dopo l'installazione di NVM che definisce e aggiunge% NVM_HOME% al percorso.

Per portarlo alla sua logica conclusione, è possibile utilizzare questa funzione ricorsiva per espandere invece:

function Expand-EnvironmentVariablesRecursively($unexpanded) {
    $previous = ''
    $expanded = $unexpanded
    while($previous -ne $expanded) {
        $previous = $expanded
        $expanded = [System.Environment]::ExpandEnvironmentVariables($previous)
    }
    return $expanded
}

E poi usa:

$env:Path = Expand-EnvironmentVariablesRecursively([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))

Ho aperto un problema per aggiungere questa soluzione refreshenvda Chocolatey.


3

Solo per aggiungere altre risposte, puoi assicurarti di non aggiungere join superflui filtrando nel caso in cui l'utente abbia un percorso vuoto.

$env:Path=(
    [System.Environment]::GetEnvironmentVariable("Path","Machine"),
    [System.Environment]::GetEnvironmentVariable("Path","User")
) -match '.' -join ';'

O, più utilmente, se stai eseguendo uno script che si aggiunge a una o più variabili di ambiente diverse, usa una funzione per reimpostarle tutte

function resetEnv {
    Set-Item `
        -Path (('Env:', $args[0]) -join '') `
        -Value ((
            [System.Environment]::GetEnvironmentVariable($args[0], "Machine"),
            [System.Environment]::GetEnvironmentVariable($args[0], "User")
        ) -match '.' -join ';')
}
resetEnv Path
resetEnv AppPath
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.