Vuelva a cargar el camino en PowerShell

145

Si tengo una instancia de PowerShell ISE ejecutándose e instalo algo que modifica la RUTA o la modifico de alguna manera fuera de PowerShell, entonces necesito reiniciar PowerShell para que vea la variable PATH actualizada.

¿Hay alguna manera de volver a cargar la ruta desde PowerShell sin reiniciarla?

robar
fuente

Respuestas:

207

Solo para sacar a la luz el comentario de Rob :

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
mpen
fuente
3
Sip. El comentario de Rob mece el Powershell Casbah, de hecho.
Cecil Curry
24
Si está utilizando a chocolate, y es cargado en su perfil, no hay un comando simple: refreshenv. Básicamente, esto ejecuta una versión más elaborada del comentario de Rob.
kumarharsh
Pasé mucho tiempo tratando de descubrir qué necesitaba hacer, ya que soy un novato de PowerShell Estaba cambiando el camino como loco y esto es exactamente lo que necesitaba. +1
cr1pto
fwiw, estoy usando chocolatey ... pero refreshenvno funcionó. La respuesta aquí ('Comentario de Robs') funcionó muy bien. Por lo tanto, puede haber algunas situaciones en las que un enfoque funciona y el otro no ...
3z33etm
3
si está instalando chocolatey y otras aplicaciones a través de chocolatey en el mismo script que modifica la variable PATH, refreshenvno funcionará. El refreshenvúnico funciona en conchas subsecuentes abiertas.
Frank Fu
72

Intente obtener la ruta de la máquina y asignarla a la ruta de la sesión.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Shay Levy
fuente
53
Gracias que funcionó! También tenía una variable de entorno de usuario llamada ruta, así que tuve que hacer esto: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Path", "User")
robar el
24

La forma más fácil, utiliza Chocolatey (freeware). Funciona tanto para CMD como para PowerShell. Luego podrá volver a cargar PATH (con expansión variable) con un comando simple:

refreshenv

Instalación desde cmd (requiere derechos 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"

Ejemplo 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
fuente
8
refreshenvno funcionó para mí (Windows 10). Todavía tenía que abrir una nueva ventana para que surta efecto.
Peter Mortensen
1
Lo probé y lo uso exactamente en Windows 10, me resulta útil con bastante frecuencia. El ejemplo de uso que hice no está preparado, es imprimir desde mi consola. ¿Quizás en su caso haya surgido algún tipo de conflicto entre el usuario y las variables del sistema? Además, como he notado, en multiconsola env (como Conemu) afecta solo a la consola actual.
Arkadiusz Przechodzki
refreshenvTampoco funciona aquí. Trabajando en algunos scripts en un entorno de Windows Sandbox y la ruta simplemente se niega a actualizarse a menos que se inicie una nueva sesión de PS.
Reece Mercer
6

Según la respuesta de mpen , aquí hay una función de PowerShell:

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

Entonces solo llama refresh-path.

Tjaart
fuente
3

Si su ruta contiene variables de entorno que no se definieron al comienzo de la sesión, también querrá expandirlas:

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

Para mí, esto fue útil después de instalar NVM, que define y agrega% NVM_HOME% a la ruta.

Para llevar esto a su conclusión lógica, podría usar esta función recursiva para expandirse en su lugar:

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

Y luego usa:

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

He abierto un problema para agregar esta solución refreshenvdesde Chocolatey.

Graham
fuente
3

Solo para agregar a otras respuestas, puede asegurarse de no agregar uniones superfluas filtrando en caso de que el usuario tenga una ruta vacía.

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

O, más útilmente, si está ejecutando un script que se agrega a diferentes o múltiples variables de entorno, use una función para restablecerlas todas

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
fuente