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

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

Ответы [ 27 ]

1 голос
/ 05 октября 2008

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

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

1 голос
/ 12 января 2017

Я использую этот скрипт 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%"
0 голосов
/ 07 декабря 2012

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

Чтобы просмотреть или изменить переменные среды: щелкните правой кнопкой мыши Мой компьютер и затем нажмите Свойства. Перейдите на вкладку «Дополнительно». Нажмите Среда переменные. Выберите один из следующих вариантов, для пользователя или системная переменная: нажмите 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.com/blog/2010/09/default-environment-variable-values-of-windows-7-xp/

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

0 голосов
/ 12 января 2013

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

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

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

ENDLOCAL & (
  SET RESULT1=%RESULT1%
  SET RESULT2=%RESULT2%
)
0 голосов
/ 25 января 2017

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

0 голосов
/ 05 октября 2008

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

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

0 голосов
/ 27 апреля 2015

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

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

setx /M ENVVAR "NEWVALUE"
set ENVVAR="NEWVALUE"

taskkill /f /IM explorer.exe
start explorer.exe >nul
exit

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

...