Recarregar o caminho no PowerShell

145

Se eu tiver uma instância do PowerShell ISE em execução e instalar algo que modifique o PATH ou o modifique de qualquer forma fora do PowerShell, será necessário reiniciar o PowerShell para que ele veja a variável PATH atualizada.

Existe uma maneira de recarregar o caminho no PowerShell sem reiniciá-lo?

roubar
fonte

Respostas:

206

Apenas para trazer à luz o comentário de Rob :

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
mpen
fonte
3
Sim. O comentário de Rob abalou o Powershell Casbah, de fato.
Cecil Curry
24
Se você estiver usando achocolatada, e ele é carregado em seu perfil, há um comando simples: refreshenv. Basicamente, isso executa uma versão mais elaborada do comentário de rob.
precisa saber é o seguinte
Passei muito tempo tentando descobrir o que eu precisava fazer, já que sou um noob de PowerShell. Estava mudando o caminho como um louco e é exatamente isso que eu precisava. +1
cr1pto 28/09
fwiw, estou usando chocolate ... mas refreshenvnão funcionou. A resposta aqui ('Robs Comment') fez o truque bem. Então, pode haver algumas situações onde uma abordagem funciona eo outro não ...
3z33etm
3
se você estiver instalando o próprio chocolatey e outros aplicativos via chocolatey no mesmo script que modifica a variável PATH, refreshenvisso não funcionará. Os refreshenvúnicos trabalhos em shells subseqent abertos.
Frank Fu
72

Tente obter o caminho da máquina e atribuí-lo ao caminho da sessão.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Shay Levy
fonte
53
Obrigado que funcionou! Eu também tinha uma variável de ambiente do usuário chamada path, então tive que fazer isso: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Caminho", "Usuário")
rob
24

A maneira mais fácil, use o Chocolatey (freeware). Funciona para o CMD e o PowerShell. Então você poderá recarregar PATH (com expansão variável) com um comando simples:

refreshenv

Instalação a partir do cmd (requer direitos de administrador):

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

Exemplo de uso:

> 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
fonte
8
refreshenvnão funcionou para mim (Windows 10). Eu ainda tinha que abrir uma nova janela para entrar em vigor.
Peter Mortensen
1
Eu testei e o uso exatamente no Windows 10, é útil para mim com bastante frequência. O exemplo de uso que eu fiz não está preparado, é impresso no meu console. Talvez no seu caso tenha surgido algum tipo de conflito entre as variáveis ​​do usuário e do sistema? Além disso, como já notei, em ambientes multiconsole (como o Conemu), afeta apenas o console atual.
Arkadiusz Przechodzki
6

Com base na resposta do mpen , aqui está uma função do PowerShell:

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

Então é só ligar refresh-path.

Tjaart
fonte
3

Se o seu caminho contiver variáveis ​​de ambiente que não foram definidas no início da sessão, você também precisará expandi-las:

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

Para mim, isso foi útil após a instalação do NVM, que define e adiciona% NVM_HOME% ao caminho.

Para levar isso à sua conclusão lógica, você pode usar esta função recursiva para expandir:

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

E então use:

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

Eu abriu uma questão de adicionar esta solução em refreshenvde Chocolatey.

Graham
fonte
3

Apenas para adicionar outras respostas, certifique-se de não adicionar junções supérfluas filtrando, caso o usuário tenha um caminho vazio.

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

Ou, mais útil, se você estiver executando um script que adiciona uma variável de ambiente diferente ou múltipla, use uma função para redefinir todas elas

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
fonte