SETX не добавляет путь к системной переменной path

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

setx PATH "%PATH%;C:Program FilesMySQLMySQL Server 5.5bin"

Я проверил путь к системной переменной после запуска выше пакетного файла, выше пути там нет.

enter image description here

вы можете увидеть все окна Variable value содержимое ниже :

C:Program Files (x86)AMD APPbinx86_64;C:Program Files (x86)AMDAPPbinx86;%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;%SYSTEMROOT%System32WindowsPowerShellv1.0;C:ProgramFiles (x86)ATI TechnologiesATI.ACECore-Static;

что я делаю не так?

6 ответов


в копилку на ответ @Endoro (мне не хватает репутации для комментариев):

Если вы хотите изменить системные переменные окружения, вы должны использовать / M, а-ля:

setx PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 5.5\bin" /M

setx.exe разборчив в размещении /M, кстати. Это должно быть в конце.


вы не должны смотреть на системные переменные среды, но и переменные среды пользователя:

enter image description here


SETX /M Path "%PATH%;%ProgramFiles%\MySQL\MySQL Server 5.5\bin\

Он добавит ваш путь к системной переменной


внимание!

setx усечет значение до 1024 символов.

Если вы используете его для изменения пути, вы можете испортить свою систему.

вы можете использовать этот фрагмент PowerShell, чтобы добавить что-то в свой путь:

$new_entry = 'c:\blah'

$old_path = [Environment]::GetEnvironmentVariable('path', 'machine');
$new_path = $old_path + ';' + $new_entry
[Environment]::SetEnvironmentVariable('path', $new_path,'Machine');

в случае, если вы не хотите повторно добавить уже существующую запись, что-то вроде этого будет делать (см. лучшую версию ниже):

$new_entry = 'c:\blah'
$search_pattern = ';' + $new_entry.Replace("\","\")

$old_path = [Environment]::GetEnvironmentVariable('path', 'machine');
$replace_string = ''
$without_entry_path = $old_path -replace $search_pattern, $replace_string
$new_path = $without_entry_path + ';' + $new_entry
[Environment]::SetEnvironmentVariable('path', $new_path,'Machine');

здесь более новая версия, которую я использую сейчас (2017-10-23). Эта версия правильно обрабатывает вложенные пути. Е. Г. он обрабатывает случай в пути "c:\tool\foo" и вы хотите добавить "c:\tool".

$desired_entry = 'C:\test'

$old_path = [Environment]::GetEnvironmentVariable('path', 'machine');

$old_path_entry_list = ($old_path).split(";")
$new_path_entry_list = new-object system.collections.arraylist

foreach($old_path_entry in $old_path_entry_list) {
    if($old_path_entry -eq $desired_entry){
        # ignore old entry
    }else{
        [void]$new_path_entry_list.Add($old_path_entry)
    }
}
[void]$new_path_entry_list.Add($desired_entry)
$new_path = $new_path_entry_list -Join ";"

[Environment]::SetEnvironmentVariable('path', $new_path,'Machine');

никогда не следует использовать setx для пути, так как он ограничен 1024 символами, как упоминалось.

можно использовать reg add:

set pathkey="HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment"
for /F "usebackq skip=2 tokens=2*" %%A IN (`reg query %pathkey% /v Path`) do (reg add %pathkey% /f /v Path /t REG_SZ /d "%%B;C:\Program Files\MySQL\MySQL Server 5.5\bin")

или установите pathkey= "HKEY_CURRENT_USER\Environment" для пути пользователя.

затем, чтобы транслировать изменение:

powershell -command "& {$md=\"[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);\"; $sm=Add-Type -MemberDefinition $md -Name NativeMethods -Namespace Win32 -PassThru;$result=[uintptr]::zero;$sm::SendMessageTimeout(0xffff,0x001A,[uintptr]::Zero,\"Environment\",2,5000,[ref]$result)}"

Я столкнулся с той же проблемой, когда попытался добавить переменные пути, связанные с fortran (Eclipse для c/C++/fortran)

Я попытался SETX / M Path " %PATH%;C:\Users\mahidhai\cygwin64\bin" в командной строке как администратор .Я получил предупреждение данные были усечены до 1024 символов и хранится .

решение: Перейдите в файл реестра напрямую. Выполнить->regedit Перейдите к среде

(весь путь: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment )

нажмите на реестр путей и добавьте переменную пути напрямую. Или удалите все повторяющиеся переменные пути .

теперь откройте командную строку и выполните ту же команду путь setx / M " %path%,"

переменная пути может быть связана с C или C++ или fortran

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