web-dev-qa-db-fra.com

Recharger le chemin dans PowerShell

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

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

113
rob

Juste pour amener commentaire de Rob à la lumière:

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

Essayez d’obtenir le chemin d’ordinateur et de l’affecter au chemin de la session.

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

Manière la plus simple, utilisez Chocolatey (freeware). Cela fonctionne à la fois pour CMD et PowerShell. Ensuite, vous pourrez recharger PATH (avec une 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
13

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

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

Ensuite, appelez simplement refresh-path.

3
Tjaart

Si votre chemin contient des variables d'environnement qui n'étaient pas définies au début de la session, vous devrez é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 avoir installé NVM, qui définit et ajoute% NVM_HOME% au chemin.

Pour mener ceci à son terme, 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 ensuite utiliser:

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

J'ai ouvert un problème ajouter cette solution dans refreshenv de Chocolatey.

2
Graham

Juste pour ajouter à d’autres réponses, vous pouvez vous assurer que vous n’ajoutez pas 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.

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
0
Hashbrown