Есть ли команда для обновления переменных среды из командной строки в Windows? - PullRequest
420 голосов
/ 05 октября 2008

Если я изменяю или добавляю переменную среды, мне нужно перезапустить командную строку. Могу ли я выполнить команду, которая сделает это без перезапуска CMD?

Ответы [ 27 ]

5 голосов
/ 25 февраля 2011

Переменные среды хранятся в HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet \ Control \ Session Manager \ Environment.

Многие из полезных переменных env, такие как Path, хранятся как REG_SZ. Существует несколько способов доступа к реестру, включая REGEDIT:

<code>REGEDIT /E &lt;filename&gt; "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"

Вывод начинается с магических чисел. Таким образом, чтобы найти его с помощью команды find, его нужно набрать и перенаправить: type <filename> | findstr -c:\"Path\"

Итак, если вы просто хотите обновить переменную пути в текущем сеансе команды с помощью того, что находится в системных свойствах, следующий пакетный скрипт работает нормально:

RefreshPath.cmd:


    @echo off

    REM This solution requests elevation in order to read from the registry.

    if exist %temp%\env.reg del %temp%\env.reg /q /f

    REGEDIT /E %temp%\env.reg "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"

    if not exist %temp%\env.reg (
       echo "Unable to write registry to temp location"
       exit 1
       )

    SETLOCAL EnableDelayedExpansion

    for /f "tokens=1,2* delims==" %%i in ('type %temp%\env.reg ^| findstr -c:\"Path\"=') do (
       set upath=%%~j
       echo !upath:\\=\! >%temp%\newpath
       )

     ENDLOCAL

     for /f "tokens=*" %%i in (%temp%\newpath) do set path=%%i
5 голосов
/ 13 июля 2017

Смущает то, что есть несколько мест для запуска cmd. В моем случае я запустил cmd из проводника Windows , а переменные окружения не изменились , а при запуске cmd из "запуска" (клавиша Windows + r) среда переменные были изменены .

В моем случае мне просто нужно было убить процесс проводника Windows из диспетчера задач, а затем снова запустить его из диспетчера задач .

Как только я это сделал, я получил доступ к новой переменной среды из cmd, который был создан из проводника Windows.

4 голосов
/ 22 декабря 2015

Попробуйте открыть новую командную строку от имени администратора. Это работало для меня в Windows 10. (Я знаю, что это старый ответ, но я должен был поделиться этим, потому что писать сценарий VBS просто для этого абсурдно).

4 голосов
/ 29 июня 2016

Самый простой способ добавить переменную в путь без перезагрузки для текущего сеанса - это открыть командную строку и ввести:

PATH=(VARIABLE);%path%

и нажмите , введите .

чтобы проверить, загружена ли ваша переменная, введите

PATH

и нажмите , введите . Однако эта переменная будет частью пути до перезагрузки.

4 голосов
/ 08 февраля 2017

Перезапуск проводника сделал это для меня, но только для новых терминалов cmd.

Терминал, который я установил, мог видеть новую переменную Path (в Windows 7).

taskkill /f /im explorer.exe && explorer.exe
3 голосов
/ 28 марта 2015

просто перезапустите explorer.exe >> протестировано на win 8 X64

3 голосов
/ 21 мая 2014

Я использую следующий код в своих пакетных скриптах:

if not defined MY_ENV_VAR (
    setx MY_ENV_VAR "VALUE" > nul
    set MY_ENV_VAR=VALUE
)
echo %MY_ENV_VAR%

Используя SET после SETX можно напрямую использовать локальную переменную без перезапуска командного окна. И при следующем запуске будет использоваться переменная окружения.

3 голосов
/ 21 мая 2016

Мне понравился подход, за которым следовал шоколад, как написано в анонимном ответе труса, так как это чисто пакетный подход. Тем не менее, он оставляет временный файл и некоторые временные переменные валяются. Я сделал более чистую версию для себя.

Создайте файл refreshEnv.bat где-нибудь на вашем PATH. Обновите консольную среду, выполнив refreshEnv.

@ECHO OFF
REM Source found on https://github.com/DieterDePaepe/windows-scripts
REM Please share any improvements made!

REM Code inspired by /81137/est-li-komanda-dlya-obnovleniya-peremennyh-sredy-iz-komandnoi-stroki-v-windows

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.
2 голосов
/ 16 июля 2018

Первая установка choco:

  • при использовании cmd @"%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"

  • при использовании powershell Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

Тогда вы можете запустить refreshenv. Работает как на cmd, так и на powershell.

2 голосов
/ 21 июня 2017

Если это касается только одной (или нескольких) конкретных переменных, которые вы хотите изменить, я думаю, что самый простой способ - это обходной путь : просто установить в своей среде И в текущем сеансе консоли

  • Set поместит переменную в ваш текущий сеанс
  • SetX поместит переменную в окружение, но НЕ в ваш текущий сеанс

У меня есть этот простой пакетный скрипт, чтобы изменить мой Maven с Java7 на Java8 (оба являются env. Vars). Пакетная папка находится в моем PATH var, поэтому я всегда могу вызвать ' j8 'и в моей консоли и в окружении моя переменная JAVA_HOME изменяется:

j8.bat:

@echo off
set JAVA_HOME=%JAVA_HOME_8%
setx JAVA_HOME "%JAVA_HOME_8%"

До сих пор я считаю, что это работает лучше и проще. Возможно, вы хотите, чтобы это было в одной команде, но ее просто нет в Windows ...

...