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?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 .
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"
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.
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).
- See previous answers
- Weitere Antworten anzeigen