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?

Respuestas:


207

Solo para sacar a la luz el comentario de Rob :

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

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")

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

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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.