Załaduj ponownie ścieżkę w programie PowerShell

145

Jeśli mam uruchomione wystąpienie PowerShell ISE i instaluję coś, co modyfikuje PATH lub modyfikuję je w jakikolwiek sposób poza PowerShell, muszę ponownie uruchomić PowerShell, aby zobaczyć zaktualizowaną zmienną PATH.

Czy istnieje sposób na ponowne załadowanie ścieżki z poziomu programu PowerShell bez ponownego jej uruchamiania?

obrabować
źródło

Odpowiedzi:

207

Żeby ujawnić komentarz Roba :

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
mpen
źródło
3
Tak. Komentarz Roba rzeczywiście wstrząsa Powershell Casbah.
Cecil Curry
24
Jeśli używasz Chocolatey, i jest ładowany do swojego profilu, jest to prostsze polecenie: refreshenv. To w zasadzie prowadzi do bardziej rozbudowanej wersji komentarza Roba.
kumarharsh
spędziłem dużo czasu, próbując wymyślić, co muszę zrobić, ponieważ jestem noobem PowerShell. Zmieniałem ścieżkę jak szalony i właśnie tego potrzebowałem. +1
cr1pto
fwiw, używam czekolady ... ale refreshenvnie zadziałało. Odpowiedź tutaj („Robs Comment”) załatwiła sprawę. Mogą więc zaistnieć sytuacje, w których jedno podejście
zadziała,
3
jeśli instalujesz chocolatey i inne aplikacje za pośrednictwem chocolatey na tym samym skrypcie, który modyfikuje zmienną PATH, refreshenvplik nie zadziała. Że refreshenvdziała tylko na muszli subseqent otwarty.
Frank Fu
72

Spróbuj uzyskać ścieżkę komputera i przypisać ją do ścieżki sesji.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Shay Levy
źródło
53
Dzięki, że zadziałało! Miałem również zmienną środowiskową użytkownika o nazwie path, więc musiałem to zrobić: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Path", "User")
okradnij
24

Najłatwiej jest użyć Chocolatey (freeware). Działa zarówno dla CMD, jak i PowerShell. Wtedy będziesz mógł przeładować PATH (z rozszerzaniem zmiennych) za pomocą prostego polecenia:

refreshenv

Instalacja z cmd (wymaga uprawnień administratora):

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

Przykładowe użycie:

> 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
źródło
8
refreshenvnie działa dla mnie (Windows 10). Nadal musiałem otworzyć nowe okno, aby to zadziałało.
Peter Mortensen,
1
Przetestowałem i używam go dokładnie na Windows 10, przydaje mi się dość często. Przykład użycia, który stworzyłem, nie jest przygotowany, jest wydrukowany z mojej konsoli. Być może w twoim przypadku doszło do konfliktu między zmiennymi użytkownika a zmiennymi systemowymi? Ponadto, jak zauważyłem, w środowisku wielokonsolowym (podobnie jak Conemu) ma to wpływ tylko na bieżącą konsolę.
Arkadiusz Przechodzki
refreshenvteż tu nie działa. Praca nad niektórymi skryptami w środowisku Windows Sandbox, a ścieżka po prostu odmawia aktualizacji, chyba że zostanie uruchomiona nowa sesja PS.
Reece Mercer
6

Na podstawie odpowiedzi mpen , oto funkcja PowerShell:

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

Po prostu zadzwoń refresh-path.

Tjaart
źródło
3

Jeśli ścieżka zawiera zmienne środowiskowe, które nie zostały zdefiniowane na początku sesji, warto je również rozwinąć:

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

Dla mnie było to przydatne po zainstalowaniu NVM, który definiuje i dodaje% NVM_HOME% do ścieżki.

Aby dojść do logicznego wniosku, możesz zamiast tego rozwinąć tę funkcję rekurencyjną:

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

A następnie użyj:

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

Mam otwarty problem , aby dodać do tego roztworu refreshenvz Chocolatey.

Graham
źródło
3

Aby dodać do innych odpowiedzi, możesz upewnić się, że nie dodasz zbędnych złączeń, filtrując w przypadku, gdy użytkownik ma pustą ścieżkę.

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

Lub, bardziej użytecznie, jeśli uruchamiasz skrypt, który dodaje do różnych lub wielu zmiennych środowiskowych, użyj funkcji, aby zresetować je wszystkie

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
źródło