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?
Antworten
Zu viele Anzeigen?Das Verwirrende ist vielleicht, dass es mehrere Stellen gibt, von denen aus man die cmd starten kann. In meinem Fall habe ich cmd im Windows-Explorer und die Umwelt Variablen haben sich nicht verändert während beim Start cmd aus dem Menü "Ausführen" (Windows-Taste + r) die Umgebung Variablen wurden geändert .
In meinem Fall musste ich nur Beenden Sie den Windows-Explorer-Prozess über den Task-Manager und starten Sie ihn dann erneut über den Task-Manager .
Sobald ich dies getan hatte, konnte ich auf die neue Umgebungsvariable über eine Cmd zugreifen, die vom Windows-Explorer aus gestartet wurde.
Diese Lösung verwende ich nun schon seit einigen Jahren:
@echo off
rem Refresh PATH from registry.
setlocal
set USR_PATH=
set SYS_PATH=
for /F "tokens=3* skip=2" %%P in ('%SystemRoot%\system32\reg.exe query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH') do @set "SYS_PATH=%%P %%Q"
for /F "tokens=3* skip=2" %%P in ('%SystemRoot%\system32\reg.exe query "HKCU\Environment" /v PATH') do @set "USR_PATH=%%P %%Q"
if "%SYS_PATH:~-1%"==" " set "SYS_PATH=%SYS_PATH:~0,-1%"
if "%USR_PATH:~-1%"==" " set "USR_PATH=%USR_PATH:~0,-1%"
endlocal & call set "PATH=%SYS_PATH%;%USR_PATH%"
goto :EOF
Bearbeiten: Hoppla, hier ist die aktualisierte Version.
Wenn es sich nur um eine (oder ein paar) bestimmte Variablen handelt, die Sie ändern möchten, ist es am einfachsten, eine Abhilfe : einfach in Ihrer Umgebung UND in Ihrer aktuellen Konsolensitzung einstellen
- Setzen setzt die Variable in Ihre aktuelle Sitzung
- SetX setzt die Variable in die Umgebung, aber NICHT in Ihre aktuelle Sitzung
Ich habe dieses einfache Batch-Skript, um meine Maven von Java7 zu Java8 zu ändern (die beide env. vars sind) Der Batch-Ordner ist in meinem PATH var, damit ich immer ' j8 ' und in meiner Konsole und in der Umgebung wird meine JAVA_HOME var geändert:
j8.bat:
@echo off
set JAVA_HOME=%JAVA_HOME_8%
setx JAVA_HOME "%JAVA_HOME_8%"
Bis jetzt finde ich, dass dies am besten und einfachsten funktioniert. Wahrscheinlich wollen Sie das in einem einzigen Befehl haben, aber das gibt es in Windows einfach nicht...
Ich verwende den folgenden Code in meinen Batch-Skripten:
if not defined MY_ENV_VAR (
setx MY_ENV_VAR "VALUE" > nul
set MY_ENV_VAR=VALUE
)
echo %MY_ENV_VAR%
Durch die Verwendung von SETZEN nach SETX ist es möglich, die "lokale" Variable direkt zu verwenden, ohne das Befehlsfenster neu zu starten. Bei der nächsten Ausführung wird dann die Umgebungsvariable verwendet.
Mir gefiel der von chocolatey verfolgte Ansatz, wie er in der Antwort von anonymous coward gepostet wurde, da es ein reiner Batch-Ansatz ist. Allerdings bleiben dabei eine temporäre Datei und einige temporäre Variablen übrig. Ich habe für mich eine sauberere Version erstellt.
Eine Datei erstellen refreshEnv.bat
irgendwo auf Ihrem PATH
. Aktualisieren Sie Ihre Konsolenumgebung durch Ausführen von refreshEnv
.
@ECHO OFF
REM Source found on https://github.com/DieterDePaepe/windows-scripts
REM Please share any improvements made!
REM Code inspired by http://stackoverflow.com/questions/171588/is-there-a-command-to-refresh-environment-variables-from-the-command-prompt-in-w
IF [%1]==[/?] GOTO :help
IF [%1]==[/help] GOTO :help
IF [%1]==[--help] GOTO :help
IF [%1]==[] GOTO :main
ECHO Unknown command: %1
EXIT /b 1
:help
ECHO Refresh the environment variables in the console.
ECHO.
ECHO refreshEnv Refresh all environment variables.
ECHO refreshEnv /? Display this help.
GOTO :EOF
:main
REM Because the environment variables may refer to other variables, we need a 2-step approach.
REM One option is to use delayed variable evaluation, but this forces use of SETLOCAL and
REM may pose problems for files with an '!' in the name.
REM The option used here is to create a temporary batch file that will define all the variables.
REM Check to make sure we don't overwrite an actual file.
IF EXIST %TEMP%\__refreshEnvironment.bat (
ECHO Environment refresh failed!
ECHO.
ECHO This script uses a temporary file "%TEMP%\__refreshEnvironment.bat", which already exists. The script was aborted in order to prevent accidental data loss. Delete this file to enable this script.
EXIT /b 1
)
REM Read the system environment variables from the registry.
FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"`) DO (
REM /I -> ignore casing, since PATH may also be called Path
IF /I NOT [%%I]==[PATH] (
ECHO SET %%I=%%K>>%TEMP%\__refreshEnvironment.bat
)
)
REM Read the user environment variables from the registry.
FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY HKCU\Environment`) DO (
REM /I -> ignore casing, since PATH may also be called Path
IF /I NOT [%%I]==[PATH] (
ECHO SET %%I=%%K>>%TEMP%\__refreshEnvironment.bat
)
)
REM PATH is a special variable: it is automatically merged based on the values in the
REM system and user variables.
REM Read the PATH variable from the system and user environment variables.
FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) DO (
ECHO SET PATH=%%K>>%TEMP%\__refreshEnvironment.bat
)
FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY HKCU\Environment /v PATH`) DO (
ECHO SET PATH=%%PATH%%;%%K>>%TEMP%\__refreshEnvironment.bat
)
REM Load the variable definitions from our temporary file.
CALL %TEMP%\__refreshEnvironment.bat
REM Clean up after ourselves.
DEL /Q %TEMP%\__refreshEnvironment.bat
ECHO Environment successfully refreshed.