Recharger le chemin dans PowerShell

145

Si j'ai une instance de PowerShell ISE en cours d'exécution et que j'installe quelque chose qui modifie le PATH ou que je le modifie de quelque manière que ce soit en dehors de PowerShell, je dois redémarrer PowerShell pour qu'il voie la variable PATH mise à jour.

Existe-t-il un moyen de recharger le chemin à partir de PowerShell sans le redémarrer?

Rob
la source

Réponses:

207

Juste pour mettre en lumière le commentaire de Rob :

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
mpen
la source
3
Ouaip. Le commentaire de Rob ébranle la Powershell Casbah, en effet.
Cecil Curry
24
Si vous utilisez chocolaté, et il est chargé dans votre profil, il y a une commande plus simple: refreshenv. Cela exécute essentiellement une version plus élaborée du commentaire de rob.
kumarharsh
J'ai passé beaucoup de temps à essayer de comprendre ce que j'avais à faire puisque je suis un noob de PowerShell. Changement de chemin comme un fou et c'est exactement ce dont j'avais besoin. +1
cr1pto
fwiw, j'utilise du chocolat ... mais refreshenvn'a pas fonctionné. La réponse ici ('Robs Comment') a bien fait l'affaire. Ainsi, il peut y avoir des situations où une approche fonctionne et l'autre ne fonctionne pas ...
3z33etm
3
si vous installez chocolatey lui-même et d'autres applications via chocolatey sur le même script qui modifie la variable PATH, refreshenvcela ne fonctionnera pas. Le refreshenvseul fonctionne sur les shells suivants ouverts.
Frank Fu
72

Essayez d'obtenir le chemin de la machine et de l'affecter au chemin de la session.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Shay Levy
la source
53
Merci qui a fonctionné! J'avais également une variable d'environnement utilisateur nommée path, donc je devais faire ceci: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Path", "User")
rob
25

Le plus simple, utilisez Chocolatey (freeware). Cela fonctionne à la fois pour CMD et PowerShell. Ensuite, vous pourrez recharger PATH (avec extension variable) avec une simple commande:

refreshenv

Installation à partir de cmd (nécessite des droits d'administrateur):

@"%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"

Exemple d'utilisation:

> 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
Arkadiusz Przechodzki
la source
9
refreshenvn'a pas fonctionné pour moi (Windows 10). Je devais encore ouvrir une nouvelle fenêtre pour que cela prenne effet.
Peter Mortensen
1
Je l'ai testé et je l'utilise exactement sur Windows 10, il me sert assez souvent. L'exemple d'utilisation que j'ai fait n'est pas préparé, il est imprimé depuis ma console. Peut-être que dans votre cas, il s'agit d'un conflit entre les variables utilisateur et système? De plus, comme je l'ai remarqué, dans l'environnement multiconsole (comme Conemu), cela n'affecte que la console actuelle.
Arkadiusz Przechodzki
refreshenvne fonctionne pas non plus ici. Travailler sur certains scripts dans un environnement Windows Sandbox et le chemin refuse simplement d'être mis à jour à moins qu'une nouvelle session PS ne soit démarrée.
Reece Mercer
6

Basé sur la réponse de mpen , voici une fonction PowerShell:

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

Alors appelez refresh-path.

Tjaart
la source
3

Si votre chemin contient des variables d'environnement qui n'ont pas été définies au début de la session, vous souhaiterez également les développer:

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

Pour moi, cela a été utile après l'installation de NVM qui définit et ajoute% NVM_HOME% au chemin.

Pour amener cela à sa conclusion logique, vous pouvez utiliser cette fonction récursive pour développer à la place:

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

Et puis utilisez:

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

J'ai ouvert un problème pour ajouter cette solution à refreshenvpartir de Chocolatey.

Graham
la source
3

Juste pour ajouter d'autres réponses, vous pouvez vous assurer de ne pas ajouter de jointures superflues en filtrant au cas où l'utilisateur aurait un chemin vide.

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

Ou, plus utilement, si vous exécutez un script qui ajoute à une ou plusieurs variables d'environnement, utilisez une fonction pour les réinitialiser toutes

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
Hashbrown
la source