Laden Sie den Pfad in PowerShell neu

144

Wenn eine Instanz von PowerShell ISE ausgeführt wird und ich etwas installiere, das den PATH ändert, oder wenn ich es außerhalb von PowerShell auf irgendeine Weise ändere, muss ich PowerShell neu starten, damit die aktualisierte PATH-Variable angezeigt wird.

Gibt es eine Möglichkeit, den Pfad aus PowerShell heraus neu zu laden, ohne ihn neu zu starten?

rauben
quelle

Antworten:

206

Nur um Robs Kommentar ans Licht zu bringen :

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
mpen
quelle
3
Jep. Robs Kommentar erschüttert tatsächlich die Powershell Casbah.
Cecil Curry
23
Wenn Sie schokoladig verwenden und es in Ihr Profil geladen wird, gibt es einen einfacheren Befehl : refreshenv. Dies führt im Grunde eine ausführlichere Version von Robs Kommentar aus.
Kumarharsh
Ich habe viel Zeit damit verbracht herauszufinden, was ich tun musste, da ich ein Powershell-Noob bin. Änderte den Weg wie verrückt und genau das brauchte ich. +1
bis
fwiw, ich benutze schokoladig ... aber es refreshenvhat nicht funktioniert. Die Antwort hier ('Robs Kommentar') hat den Trick gut gemacht. Es kann also Situationen geben, in denen ein Ansatz funktioniert und der andere nicht ...
3z33etm
3
Wenn Sie Chocolatey selbst und andere Apps über Chocolatey im selben Skript installieren, das die PATH-Variable ändert, refreshenvfunktioniert dies nicht. Das refreshenveinzige funktioniert bei nachfolgenden geöffneten Muscheln.
Frank Fu
72

Versuchen Sie, den Maschinenpfad abzurufen und dem Pfad der Sitzung zuzuweisen.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Shay Levy
quelle
52
Danke das hat funktioniert! Ich hatte auch eine Benutzerumgebungsvariable namens path, also musste ich Folgendes tun: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Pfad", "Benutzer")
Rob
24

Verwenden Sie am einfachsten Chocolatey (Freeware). Es funktioniert sowohl für CMD als auch für PowerShell. Dann können Sie PATH (mit variabler Erweiterung) mit einem einfachen Befehl neu laden:

refreshenv

Installation von cmd (erfordert Administratorrechte):

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

Anwendungsbeispiel:

> 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
quelle
8
refreshenvhat bei mir nicht funktioniert (Windows 10). Ich musste noch ein neues Fenster öffnen, damit es wirksam wurde.
Peter Mortensen
1
Ich habe es genau unter Windows 10 getestet und verwendet, es ist ziemlich oft für mich nützlich. Das von mir erstellte Verwendungsbeispiel ist nicht vorbereitet, sondern wird von meiner Konsole gedruckt. Vielleicht ist es in Ihrem Fall zu einem Konflikt zwischen Benutzer- und Systemvariablen gekommen? Wie ich bemerkt habe, betrifft dies in Multiconsole-Umgebungen (wie Conemu) nur die aktuelle Konsole.
Arkadiusz Przechodzki
6

Basierend auf der Antwort von mpen ist hier eine PowerShell-Funktion:

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

Dann ruf einfach an refresh-path.

Tjaart
quelle
3

Wenn Ihr Pfad Umgebungsvariablen enthält, die zu Beginn der Sitzung nicht definiert wurden, sollten Sie auch diese erweitern:

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

Für mich war dies nach der Installation von NVM nützlich, das% NVM_HOME% definiert und dem Pfad hinzufügt.

Um dies zu seiner logischen Schlussfolgerung zu bringen, können Sie stattdessen diese rekursive Funktion verwenden, um Folgendes zu erweitern:

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

Und dann benutze:

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

Ich habe ein Problem geöffnet , um diese Lösung refreshenvvon Chocolatey hinzuzufügen .

Graham
quelle
3

Um andere Antworten zu ergänzen, können Sie sicherstellen, dass Sie keine überflüssigen Verknüpfungen hinzufügen, indem Sie filtern, falls der Benutzer einen leeren Pfad hat.

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

Wenn Sie ein Skript ausführen, das einer anderen oder mehreren Umgebungsvariablen hinzugefügt wird, verwenden Sie eine Funktion, um alle zurückzusetzen

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
quelle