Есть ли команда для обновления переменных среды из командной строки в Windows?

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

вопрос задан 5.10.2008
Eric Schoonover
27254 репутация

27 ответов


  • 118 рейтинг

    Вы можете перехватить системные переменные среды с помощью сценария vbs, но вам нужен сценарий bat для фактического изменения текущих переменных среды, поэтому это комбинированное решение.

    Создайте файл с именем resetvars.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("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
    

    создайте еще одно имя файла resetvars. летучая мышь, содержащая этот код, то же место:

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

    Если вы хотите обновить переменные среды, просто запустите resetvars.bat


    Апологетика :

    Две основные проблемы, с которыми я столкнулся при решении этой проблемы:

    а. Я не смог найти простой способ экспорта переменных среды из сценария VBS обратно в командную строку, и

    б. Переменная среды PATH - это объединение пользовательских и системных переменных PATH.

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

    Я использую странный механизм VBS + BAT + временная BAT, чтобы обойти проблему экспорта переменных из VBS.

    Примечание : этот скрипт не удаляет переменные.

    Это, вероятно, можно улучшить.

    ДОБАВЛЕНО

    Если вам нужно экспортировать среду из одного окна cmd в другое, используйте этот скрипт (назовем его 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
    

    Запустите exportvars.vbs в окне, которое вы хотите экспортировать из , затем переключитесь в окно, которое вы хотите экспортировать в , и введите:

    "%TEMP%\resetvars.bat"
    
    ответ дан itsadok, с репутацией 18799, 5.10.2008
  • 73 рейтинг

    Вот что использует Chocolatey.

    https: // github. ком / шоколадный / шоколадно / BLOB / Master / SRC / шоколадное. ресурсы / перенаправляет / 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 | set /p dummy="Reading environment variables from registry. 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
    
        :: Set these variables
        call "%TEMP%\_env.cmd"
    
        echo | set /p dummy="Done"
        echo .
    
    ответ дан anonymous coward, с репутацией 731, 6.09.2015
  • 54 рейтинг

    По своему замыслу в Windows отсутствует механизм , встроенный в механизм для распространения переменной среды add / change / remove в уже запущенный cmd. Отлично, либо из другого cmd. exe или из «Мой компьютер -> Свойства -> Расширенные настройки -> Переменные среды».

    Если вы изменяете или добавляете новую переменную среды вне области существующей открытой командной строки, вам необходимо либо перезапустить командную строку, либо добавить вручную, используя SET в существующей командной строке.

    Последний принятый ответ показывает частичное решение проблемы путем обновления вручную всех переменных среды в сценарии. Сценарий обрабатывает сценарий изменения глобальных переменных среды в «Мой компьютер. , , Переменные среды ", но если переменная среды изменяется в одном cmd. exe скрипт не распространит его на другой запущенный cmd. EXE.

    ответ дан Kev, с репутацией 95664, 5.10.2008
  • 34 рейтинг

    Это работает на Windows 7: SET PATH=%PATH%;C:\CmdShortcuts

    протестирован путем ввода echo% PATH% и все заработало, отлично. также установите, если вы открываете новый cmd, больше не нужны эти надоедливые перезагрузки :)

    ответ дан kristofer månsson, с репутацией 469, 26.01.2012
  • 32 рейтинг

    Я наткнулся на этот ответ, прежде чем в конце концов нашел более простое решение.

    Просто перезапустите explorer.exe в диспетчере задач.

    Я не тестировал, но вам также может потребоваться повторно открыть командную строку.

    Кредит Timo Huovinen здесь: Узел не распознан, хотя успешно установлен (если это помогло вам, пожалуйста, дайте кредит этого комментария этого человека).

    ответ дан wharding28, с репутацией 807, 25.02.2014
  • 31 рейтинг

    В Windows 7/8/10 вы можете установить Chocolatey, в котором есть встроенный скрипт.

    После установки Chocolatey просто наберите «refreshenv» без кавычек.

    ответ дан jolly, с репутацией 500, 28.06.2017
  • 24 рейтинг

    Используйте «setx» и перезапустите командную строку

    Для этой работы существует инструмент командной строки с именем « setx ». Это для чтения и записи переменных env. Переменные сохраняются после закрытия командного окна.

    Он «Создает или изменяет переменные среды в пользовательской или системной среде, не требуя программирования или создания сценариев. Команда setx также извлекает значения ключей реестра и записывает их в текстовые файлы. "

    Примечание: переменные, созданные или измененные этим инструментом, будут доступны в будущих окнах команд, но не в текущей CMD. Exe командное окно. Итак, вы должны перезагрузить.

    Если отсутствует setx:


    Или изменить реестр

    MSDN говорит:

    Чтобы программно добавить или изменить системные переменные среды, добавьте их к HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Раздел реестра Manager \ Environment , затем трансляция WM_SETTINGCHANGE сообщение с lParam , установленным в строку « Environment ».

    Это позволяет приложениям, таким как оболочка, забирать ваши обновления.

    ответ дан Jens A. Koch, с репутацией 25094, 14.08.2012
  • 13 рейтинг

    Вызов этой функции сработал для меня:

    VOID Win32ForceSettingsChange()
    {
        DWORD dwReturnValue;
        ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue);
    }
    
    ответ дан Brian Weed, с репутацией 131, 19.03.2010
  • 10 рейтинг

    Лучший способ, который я придумал, - просто выполнить запрос реестра. Вот мой пример.

    В моем примере я выполнил установку с использованием пакетного файла, в который были добавлены новые переменные среды. Мне нужно было что-то сделать с этим, как только установка была завершена, но я не смог запустить новый процесс с этими новыми переменными. Я протестировал порождение другого окна проводника и перезвонил в cmd. exe, и это работало, но в Vista и Windows 7, Explorer работает только как один экземпляр и, как правило, вошел в систему. Это не получится с автоматизацией, так как мне нужно, чтобы мои права администратора делали что-либо независимо от запуска из локальной системы или от имени администратора на компьютере. Ограничением является то, что он не обрабатывает такие вещи, как путь, это работает только для простых переменных окружения. Это позволило мне использовать пакет для перехода в каталог (с пробелами) и копирования в файлы. exes и т. д. Это было написано сегодня из майских ресурсов на stackoverflow. com

    Первоначальная партия вызывает новую партию:

    testenvget. cmd SDROOT (или любая другая переменная)

    @ECHO OFF
    setlocal ENABLEEXTENSIONS
    set keyname=HKLM\System\CurrentControlSet\Control\Session Manager\Environment
    set value=%1
    SET ERRKEY=0
    
    REG QUERY "%KEYNAME%" /v "%VALUE%" 2>NUL| FIND /I "%VALUE%"
    IF %ERRORLEVEL% EQU 0 (
    ECHO The Registry Key Exists 
    ) ELSE (
    SET ERRKEY=1
    Echo The Registry Key Does not Exist
    )
    
    Echo %ERRKEY%
    IF %ERRKEY% EQU 1 GOTO :ERROR
    
    FOR /F "tokens=1-7" %%A IN ('REG QUERY "%KEYNAME%" /v "%VALUE%" 2^>NUL^| FIND /I "%VALUE%"') DO (
    ECHO %%A
    ECHO %%B
    ECHO %%C
    ECHO %%D
    ECHO %%E
    ECHO %%F
    ECHO %%G
    SET ValueName=%%A
    SET ValueType=%%B
    SET C1=%%C
    SET C2=%%D
    SET C3=%%E
    SET C4=%%F
    SET C5=%%G
    )
    
    SET VALUE1=%C1% %C2% %C3% %C4% %C5%
    echo The Value of %VALUE% is %C1% %C2% %C3% %C4% %C5%
    cd /d "%VALUE1%"
    pause
    REM **RUN Extra Commands here**
    GOTO :EOF
    
    :ERROR
    Echo The the Enviroment Variable does not exist.
    pause
    GOTO :EOF
    

    Также есть другой метод, который я придумал из разных идей. Пожалуйста, смотрите ниже. В основном это приведет к получению самой новой переменной пути из реестра, однако это вызовет ряд проблем, поскольку запрос реестра будет давать переменные сам по себе, что означает, что везде, где есть переменная, это не будет работать, поэтому для борьбы с этой проблемой я в основном удвоить путь. Очень противный Более предпочтительным методом было бы сделать: Set Path =% Path%; C: \ Program Files \ Software. , , , \

    Несмотря на то, что здесь новый пакетный файл, пожалуйста, будьте осторожны.

    @ECHO OFF
    SETLOCAL ENABLEEXTENSIONS
    set org=%PATH%
    for /f "tokens=2*" %%A in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path ^|FIND /I "Path"') DO (
    SET path=%%B
    )
    SET PATH=%org%;%PATH%
    set path
    
    ответ дан Christopher Holmes, с репутацией 109, 21.06.2012
  • 7 рейтинг

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

    В качестве подтверждения концепции я написал этот пример приложения, которое только что отредактировало одну (известную) переменную среды в cmd. EXE-процесс:

    typedef DWORD (__stdcall *NtQueryInformationProcessPtr)(HANDLE, DWORD, PVOID, ULONG, PULONG);
    
    int __cdecl main(int argc, char* argv[])
    {
        HMODULE hNtDll = GetModuleHandleA("ntdll.dll");
        NtQueryInformationProcessPtr NtQueryInformationProcess = (NtQueryInformationProcessPtr)GetProcAddress(hNtDll, "NtQueryInformationProcess");
    
        int processId = atoi(argv[1]);
        printf("Target PID: %u\n", processId);
    
        // open the process with read+write access
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, 0, processId);
        if(hProcess == NULL)
        {
            printf("Error opening process (%u)\n", GetLastError());
            return 0;
        }
    
        // find the location of the PEB
        PROCESS_BASIC_INFORMATION pbi = {0};
        NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL);
        if(status != 0)
        {
            printf("Error ProcessBasicInformation (0x%8X)\n", status);
        }
        printf("PEB: %p\n", pbi.PebBaseAddress);
    
        // find the process parameters
        char *processParamsOffset = (char*)pbi.PebBaseAddress + 0x20; // hard coded offset for x64 apps
        char *processParameters = NULL;
        if(ReadProcessMemory(hProcess, processParamsOffset, &processParameters, sizeof(processParameters), NULL))
        {
            printf("UserProcessParameters: %p\n", processParameters);
        }
        else
        {
            printf("Error ReadProcessMemory (%u)\n", GetLastError());
        }
    
        // find the address to the environment table
        char *environmentOffset = processParameters + 0x80; // hard coded offset for x64 apps
        char *environment = NULL;
        ReadProcessMemory(hProcess, environmentOffset, &environment, sizeof(environment), NULL);
        printf("environment: %p\n", environment);
    
        // copy the environment table into our own memory for scanning
        wchar_t *localEnvBlock = new wchar_t[64*1024];
        ReadProcessMemory(hProcess, environment, localEnvBlock, sizeof(wchar_t)*64*1024, NULL);
    
        // find the variable to edit
        wchar_t *found = NULL;
        wchar_t *varOffset = localEnvBlock;
        while(varOffset < localEnvBlock + 64*1024)
        {
            if(varOffset[0] == '\0')
            {
                // we reached the end
                break;
            }
            if(wcsncmp(varOffset, L"ENVTEST=", 8) == 0)
            {
                found = varOffset;
                break;
            }
            varOffset += wcslen(varOffset)+1;
        }
    
        // check to see if we found one
        if(found)
        {
            size_t offset = (found - localEnvBlock) * sizeof(wchar_t);
            printf("Offset: %Iu\n", offset);
    
            // write a new version (if the size of the value changes then we have to rewrite the entire block)
            if(!WriteProcessMemory(hProcess, environment + offset, L"ENVTEST=def", 12*sizeof(wchar_t), NULL))
            {
                printf("Error WriteProcessMemory (%u)\n", GetLastError());
            }
        }
    
        // cleanup
        delete[] localEnvBlock;
        CloseHandle(hProcess);
    
        return 0;
    }
    

    Пример вывода:

    >set ENVTEST=abc
    
    >cppTest.exe 13796
    Target PID: 13796
    PEB: 000007FFFFFD3000
    UserProcessParameters: 00000000004B2F30
    environment: 000000000052E700
    Offset: 1528
    
    >set ENVTEST
    ENVTEST=def
    

    Примечания

    Этот подход также будет ограничен ограничениями безопасности. Если цель запускается на более высоком уровне или с более высокой учетной записью (например, SYSTEM), у нас не будет разрешения редактировать ее память.

    Если вы хотите сделать это с 32-битным приложением, жестко закодированные смещения выше изменятся на 0x10 и 0x48 соответственно. Эти смещения могут быть найдены путем выгрузки структур _PEB и _RTL_USER_PROCESS_PARAMETERS в отладчике (например, г. в WinDbg dt _PEB и dt _RTL_USER_PROCESS_PARAMETERS)

    Чтобы преобразовать концептуальное доказательство в то, что нужно ОП, нужно просто перечислить текущие переменные среды системы и пользователя (например, задокументированные в ответе @ tsadok) и записать всю таблицу среды в память целевого процесса.

    Редактировать: Размер блока среды также сохраняется в структуре _RTL_USER_PROCESS_PARAMETERS, но память выделяется в куче процесса. Таким образом, из внешнего процесса у нас не было бы возможности изменить его размер и сделать его больше. Я поиграл с использованием VirtualAllocEx для выделения дополнительной памяти в целевом процессе для хранилища среды, и смог установить и прочитать совершенно новую таблицу. К сожалению, любая попытка изменить окружение из обычных средств завершится сбоем и сгорит, так как адрес больше не указывает на кучу (он падает в RtlSizeHeap).

    ответ дан josh poley, с репутацией 5688, 15.08.2013
  • 5 рейтинг

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

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

    REGEDIT /E <filename> "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"

    Вывод начинается с магических чисел. Таким образом, чтобы найти его с помощью команды find, его нужно набрать и перенаправить: type | 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
    ответ дан Algonaut, с репутацией 136, 24.02.2011
  • 4 рейтинг

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

    ответ дан estebro, с репутацией 357, 22.12.2015
  • 3 рейтинг

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

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

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

    ответ дан Daniel Fensterheim, с репутацией 66, 13.07.2017
  • 3 рейтинг

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

    PATH=(VARIABLE);%path%
    

    и нажмите enter.

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

    PATH
    

    и нажмите enter. Тем не менее, переменная будет только частью пути до перезагрузки.

    ответ дан Richard Woodruff, с репутацией 31, 28.06.2016
  • 3 рейтинг

    просто перезапустите проводник. exe & gt; & gt; проверено на победу 8 X64

    ответ дан SkyW3lker, с репутацией 62, 28.03.2015
  • 3 рейтинг

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

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

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

    ответ дан Sebastian, с репутацией 171, 21.05.2014
  • 3 рейтинг

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

    Создайте файл 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 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.
    
    ответ дан DieterDP, с репутацией 1671, 21.05.2016
  • 2 рейтинг

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

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

    taskkill /f /im explorer.exe && explorer.exe
    
    ответ дан Vince, с репутацией 41, 8.02.2017
  • 1 рейтинг

    Прямого пути нет, как сказал Кев. В большинстве случаев проще создать другую коробку CMD. Еще более досадно, что работающие программы также не знают об изменениях (хотя IIRC может показывать широковещательное сообщение, чтобы получать уведомления о таких изменениях).

    Это было хуже: в старых версиях Windows вам приходилось выходить из системы, а затем снова входить в нее, чтобы учесть изменения. , ,

    ответ дан PhiLho, с репутацией 34372, 5.10.2008
  • 1 рейтинг

    Первая установка 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.

    ответ дан Vasantha Ganesh K, с репутацией 147, 16.07.2018
  • 1 рейтинг

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

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

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

    j8. летучая мышь:

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

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

    ответ дан Jeroen van Dijk-Jun, с репутацией 722, 21.06.2017
  • 1 рейтинг

    Я использую этот скрипт Powershell для добавления к переменной PATH . Я считаю, что с небольшой корректировкой это может сработать и в вашем случае.

    #REQUIRES -Version 3.0
    
    if (-not ("win32.nativemethods" -as [type])) {
        # import sendmessagetimeout from win32
        add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessageTimeout(
       IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
       uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
    "@
    }
    
    $HWND_BROADCAST = [intptr]0xffff;
    $WM_SETTINGCHANGE = 0x1a;
    $result = [uintptr]::zero
    
    function global:ADD-PATH
    {
        [Cmdletbinding()]
        param ( 
            [parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0)] 
            [string] $Folder
        )
    
        # See if a folder variable has been supplied.
        if (!$Folder -or $Folder -eq "" -or $Folder -eq $null) { 
            throw 'No Folder Supplied. $ENV:PATH Unchanged'
        }
    
        # Get the current search path from the environment keys in the registry.
        $oldPath=$(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path
    
        # See if the new Folder is already in the path.
        if ($oldPath | Select-String -SimpleMatch $Folder){ 
            return 'Folder already within $ENV:PATH' 
        }
    
        # Set the New Path and add the ; in front
        $newPath=$oldPath+';'+$Folder
        Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath -ErrorAction Stop
    
        # Show our results back to the world
        return 'This is the new PATH content: '+$newPath
    
        # notify all windows of environment block change
        [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [uintptr]::Zero, "Environment", 2, 5000, [ref]$result)
    }
    
    function global:REMOVE-PATH {
        [Cmdletbinding()]
        param ( 
            [parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0)]
            [String] $Folder
        )
    
        # See if a folder variable has been supplied.
        if (!$Folder -or $Folder -eq "" -or $Folder -eq $NULL) { 
            throw 'No Folder Supplied. $ENV:PATH Unchanged'
        }
    
        # add a leading ";" if missing
        if ($Folder[0] -ne ";") {
            $Folder = ";" + $Folder;
        }
    
        # Get the Current Search Path from the environment keys in the registry
        $newPath=$(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path
    
        # Find the value to remove, replace it with $NULL. If it's not found, nothing will change and you get a message.
        if ($newPath -match [regex]::Escape($Folder)) { 
            $newPath=$newPath -replace [regex]::Escape($Folder),$NULL 
        } else { 
            return "The folder you mentioned does not exist in the PATH environment" 
        }
    
        # Update the Environment Path
        Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath -ErrorAction Stop
    
        # Show what we just did
        return 'This is the new PATH content: '+$newPath
    
        # notify all windows of environment block change
        [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [uintptr]::Zero, "Environment", 2, 5000, [ref]$result)
    }
    
    
    # Use ADD-PATH or REMOVE-PATH accordingly.
    
    #Anything to Add?
    
    #Anything to Remove?
    
    REMOVE-PATH "%_installpath_bin%"
    
    ответ дан Iulian Dita, с репутацией 844, 12.01.2017
  • 0 рейтинг

    нет, я так не думаю. , , Вы можете установить их вручную, хотя. Таким образом, вы можете поместить их в пакетный файл или что-то.

    , вероятно, мог бы создать утилиту / скрипт (если кто-то еще этого не сделал), который запрашивает реестр и устанавливает текущую среду такой же

    ответ дан Keith Nicholas, с репутацией 33298, 5.10.2008
  • 0 рейтинг

    Редактировать: это работает, только если изменения среды, которые вы делаете, являются результатом запуска командного файла.

    Если пакетный файл начинается с SETLOCAL, то при выходе он всегда будет возвращаться к исходной среде, даже если вы забудете вызвать ENDLOCAL до выхода из пакета или если он неожиданно прервется.

    Почти каждый пакетный файл, который я пишу, начинается с SETLOCAL, так как в большинстве случаев я не хочу, чтобы побочные эффекты изменений среды сохранялись. В тех случаях, когда я хочу, чтобы определенные изменения переменных среды распространялись за пределы командного файла, мои последние ENDLOCAL выглядят так:

    ENDLOCAL & (
      SET RESULT1=%RESULT1%
      SET RESULT2=%RESULT2%
    )
    
    ответ дан wardies, с репутацией 838, 12.01.2013
  • -1 рейтинг

    Чтобы решить эту проблему, я изменил переменную среды, используя ОБА setx и set, а затем перезапустил все экземпляры проводника. EXE. Таким образом, любой запущенный процесс будет иметь новую переменную среды.

    Мой пакетный скрипт для этого:

    setx /M ENVVAR "NEWVALUE"
    set ENVVAR="NEWVALUE"
    
    taskkill /f /IM explorer.exe
    start explorer.exe >nul
    exit
    

    Проблема с этим подходом состоит в том, что все окна проводника, которые в настоящее время открыты, будут закрыты, что, вероятно, является плохой идеей. Но посмотрите статью Кева, чтобы узнать, почему это необходимо

    ответ дан Jens Hykkelbjerg, с репутацией 1, 27.04.2015
  • -2 рейтинг

    Или вы можете просто сделать это вручную через

    Чтобы просмотреть или изменить переменные среды: щелкните правой кнопкой мыши Мой компьютер и затем нажмите Свойства. Перейдите на вкладку «Дополнительно». Нажмите Среда переменные. Выберите один из следующих вариантов, для пользователя или системная переменная: нажмите New, чтобы добавить новое имя и значение переменной. Нажмите существующей переменной, а затем нажмите кнопку «Изменить», чтобы изменить ее имя или значение. Щелкните существующую переменную, а затем нажмите «Удалить», чтобы удалить ее. http: // support. Microsoft. com / kb / 310519

    Windows XP Переменные среды

    %ALLUSERSPROFILE% (%PROGRAMDATA%)   C:\Documents and Settings\All Users
    %APPDATA%   C:\Documents and Settings\{username}\Application Data
    %COMPUTERNAME%  {computername}
    %COMMONPROGRAMFILES%    C:\Program Files\Common Files
    %COMMONPROGRAMFILES(x86)%   C:\Program Files (x86)\Common Files
    %COMSPEC%   C:\Windows\System32\cmd.exe
    %HOMEDRIVE% C:
    %HOMEPATH%  \Documents and Settings\{username}
    %LOCALAPPDATA%  Not available
    %LOGONSERVER%   \\{domain_logon_server}
    %PATH%  C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
    %PATHEXT%   .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH
    %PROGRAMFILES%  C:\Program Files
    %PROGRAMFILES(X86)% C:\Program Files (x86) (only in 64-bit version)
    %PROMPT%    Code for current command prompt format. Code is usually $P$G
    %SystemDrive%   C:
    %SystemRoot%    The Windows directory, usually C:\Windows, formerly C:\WINNT
    %TEMP% and %TMP%    C:\Documents and Settings\{username}\Local Settings\Temp
    %USERDOMAIN%    {userdomain}
    %USERNAME%  {username}
    %USERPROFILE%   C:\Documents and Settings\{username}
    %WINDIR%    C:\Windows
    %PUBLIC%    
    %PROGRAMDATA%   Only available in Windows Vista and newer versions
    %PSModulePath%  
    

    Windows 7 Переменные среды

    %ALLUSERSPROFILE% (%PROGRAMDATA%)   C:\ProgramData
    %APPDATA%   C:\Users\{username}\AppData\Roaming
    %COMPUTERNAME%  {computername}
    %COMMONPROGRAMFILES%    C:\Program Files\Common Files
    %COMMONPROGRAMFILES(x86)%   C:\Program Files (x86)\Common Files
    %COMSPEC%   C:\Windows\System32\cmd.exe
    %HOMEDRIVE% C:
    %HOMEPATH%  \Users\{username}
    %LOCALAPPDATA%  C:\Users\{username}\AppData\Local
    %LOGONSERVER%   \\{domain_logon_server}
    %PATH%  C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
    %PATHEXT%   .com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc
    %PROGRAMFILES%  C:\Program Files
    %PROGRAMFILES(X86)% C:\Program Files (x86) (only in 64-bit version)
    %PROMPT%    Code for current command prompt format. Code is usually $P$G
    %SystemDrive%   C:
    %SystemRoot%    C:\Windows
    %TEMP% and %TMP%    C:\Users\{username}\AppData\Local\Temp
    %USERDOMAIN%    {userdomain}
    %USERNAME%  {username}
    %USERPROFILE%   C:\Users\{username}
    %WINDIR%    C:\Windows
    %PUBLIC%    C:\Users\Public
    %PROGRAMDATA%   C:\ProgramData
    %PSModulePath%  %SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\
    

    http: // www. binbert. ru / blog / 2010/09 / default-environment-variable-values-of-windows-7-xp /

    надеюсь, что это помогает.

    ответ дан user1883607, с репутацией 21, 6.12.2012
  • -3 рейтинг

    Просто введите «# -r» (без кавычек # с параметром -r) в своем терминале. И вы все настроены на пути по умолчанию :)

    ответ дан GauravSagar01, с репутацией 1, 25.01.2017