685 Stimmen

Gibt es einen Befehl zum Aktualisieren von Umgebungsvariablen über die Eingabeaufforderung in Windows?

Wenn ich eine Umgebungsvariable ändere oder hinzufüge, muss ich die Eingabeaufforderung neu starten. Gibt es einen Befehl, den ich ausführen könnte, ohne CMD neu zu starten?

292voto

jolly Punkte 2606

Unter Windows 7/8/10 können Sie Chocolatey installieren, das ein entsprechendes Skript integriert hat.

Nachdem Sie Chocolatey installiert haben, geben Sie einfach refreshenv .

165voto

anonymous coward Punkte 1441

Hier ist, was Chocolatey verwendet.

https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd

@echo off
::
:: RefreshEnv.cmd
::
:: Batch file to read environment variables from registry and
:: set session variables to these values.
::
:: With this batch file, there should be no need to reload command
:: environment every time you want environment changes to propagate

::echo "RefreshEnv.cmd only works from cmd.exe, please install the Chocolatey Profile to take advantage of refreshenv from PowerShell"
echo | set /p dummy="Refreshing environment variables from registry for cmd.exe. Please wait..."

goto main

:: Set one environment variable from registry key
:SetFromReg
    "%WinDir%\System32\Reg" QUERY "%~1" /v "%~2" > "%TEMP%\_envset.tmp" 2>NUL
    for /f "usebackq skip=2 tokens=2,*" %%A IN ("%TEMP%\_envset.tmp") do (
        echo/set "%~3=%%B"
    )
    goto :EOF

:: Get a list of environment variables from registry
:GetRegEnv
    "%WinDir%\System32\Reg" QUERY "%~1" > "%TEMP%\_envget.tmp"
    for /f "usebackq skip=2" %%A IN ("%TEMP%\_envget.tmp") do (
        if /I not "%%~A"=="Path" (
            call :SetFromReg "%~1" "%%~A" "%%~A"
        )
    )
    goto :EOF

:main
    echo/@echo off >"%TEMP%\_env.cmd"

    :: Slowly generating final file
    call :GetRegEnv "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" >> "%TEMP%\_env.cmd"
    call :GetRegEnv "HKCU\Environment">>"%TEMP%\_env.cmd" >> "%TEMP%\_env.cmd"

    :: Special handling for PATH - mix both User and System
    call :SetFromReg "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" Path Path_HKLM >> "%TEMP%\_env.cmd"
    call :SetFromReg "HKCU\Environment" Path Path_HKCU >> "%TEMP%\_env.cmd"

    :: Caution: do not insert space-chars before >> redirection sign
    echo/set "Path=%%Path_HKLM%%;%%Path_HKCU%%" >> "%TEMP%\_env.cmd"

    :: Cleanup
    del /f /q "%TEMP%\_envset.tmp" 2>nul
    del /f /q "%TEMP%\_envget.tmp" 2>nul

    :: capture user / architecture
    SET "OriginalUserName=%USERNAME%"
    SET "OriginalArchitecture=%PROCESSOR_ARCHITECTURE%"

    :: Set these variables
    call "%TEMP%\_env.cmd"

    :: Cleanup
    del /f /q "%TEMP%\_env.cmd" 2>nul

    :: reset user / architecture
    SET "USERNAME=%OriginalUserName%"
    SET "PROCESSOR_ARCHITECTURE=%OriginalArchitecture%"

    echo | set /p dummy="Finished."
    echo .

154voto

itsadok Punkte 27963

Sie können die Systemumgebungsvariablen mit einem vbs-Skript erfassen, aber Sie benötigen ein bat-Skript, um die aktuellen Umgebungsvariablen tatsächlich zu ändern, daher ist dies eine kombinierte Lösung.

Erstellen Sie eine Datei mit dem Namen resetvars.vbs die diesen Code enthält, und speichern Sie sie im Pfad:

Set oShell = WScript.CreateObject("WScript.Shell")
filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat")
Set objFileSystem = CreateObject("Scripting.fileSystemObject")
Set oFile = objFileSystem.CreateTextFile(filename, TRUE)

set oEnv=oShell.Environment("System")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next
path = oEnv("PATH")

set oEnv=oShell.Environment("User")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next

path = path & ";" & oEnv("PATH")
oFile.WriteLine("SET PATH=" & path)
oFile.Close

Erstellen Sie eine weitere Datei mit dem Namen resetvars.bat, die diesen Code enthält, am gleichen Ort:

@echo off
%~dp0resetvars.vbs
call "%TEMP%\resetvars.bat"

Wenn Sie die Umgebungsvariablen aktualisieren möchten, führen Sie einfach resetvars.bat


Apologetik :

Die beiden Hauptprobleme, die ich bei der Entwicklung dieser Lösung hatte, waren

a. Ich konnte keinen einfachen Weg finden, um Umgebungsvariablen aus einem vbs-Skript zurück in die Eingabeaufforderung zu exportieren, und

b. die Umgebungsvariable PATH ist eine Verkettung der Benutzer- und der System-PATH-Variablen.

Ich bin mir nicht sicher, wie die allgemeine Regel für kollidierende Variablen zwischen Benutzer und System lautet, daher habe ich mich dafür entschieden, dass Benutzer Vorrang vor System hat, außer bei der PATH-Variable, die speziell behandelt wird.

Ich verwende den seltsamen Mechanismus vbs+bat+temporary bat, um das Problem des Exports von Variablen aus vbs zu umgehen.

Hinweis : Dieses Skript löscht keine Variablen.

Dies kann wahrscheinlich verbessert werden.

HINZUFÜGEN

Wenn Sie die Umgebung von einem Cmd-Fenster in ein anderes exportieren müssen, verwenden Sie dieses Skript (nennen wir es exportvars.vbs ):

Set oShell = WScript.CreateObject("WScript.Shell")
filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat")
Set objFileSystem = CreateObject("Scripting.fileSystemObject")
Set oFile = objFileSystem.CreateTextFile(filename, TRUE)

set oEnv=oShell.Environment("Process")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next
oFile.Close

ausführen. exportvars.vbs in dem Fenster, das Sie exportieren möchten von und wechseln Sie dann zu dem Fenster, das Sie exportieren möchten. a und Typ:

"%TEMP%\resetvars.bat"

71voto

Kev Punkte 115293

Von Haus aus gibt es keine eingebaut Mechanismus für Windows, um eine Umgebungsvariable, die hinzugefügt/geändert/entfernt wurde, an eine bereits laufende cmd.exe weiterzugeben, entweder von einer anderen cmd.exe oder von "Arbeitsplatz -> Eigenschaften -> Erweiterte Einstellungen -> Umgebungsvariablen".

Wenn Sie eine neue Umgebungsvariable außerhalb des Bereichs einer bereits geöffneten Eingabeaufforderung ändern oder hinzufügen, müssen Sie entweder die Eingabeaufforderung neu starten oder sie manuell mit SET in der bestehenden Eingabeaufforderung hinzufügen.

El letzte akzeptierte Antwort zeigt eine teilweise Umgehung durch manuelles Aktualisieren alle die Umgebungsvariablen in einem Skript. Das Skript behandelt den Anwendungsfall des globalen Änderns von Umgebungsvariablen in "Arbeitsplatz... Umgebungsvariablen", aber wenn eine Umgebungsvariable in einer cmd.exe geändert wird, überträgt das Skript sie nicht auf eine andere laufende cmd.exe.

60voto

wharding28 Punkte 1105

Ich bin auf diese Antwort gestoßen, bevor ich schließlich eine einfachere Lösung gefunden habe.

Einfach neu starten explorer.exe im Task-Manager.

Ich habe es nicht getestet, aber möglicherweise müssen Sie auch die Eingabeaufforderung erneut öffnen.

Kredit an Timo Huovinen hier: Knoten nicht erkannt, obwohl erfolgreich installiert (wenn Ihnen das geholfen hat, geben Sie bitte dem Kommentar dieses Mannes Anerkennung).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X