SETX не добавляет путь к системной переменной пути
Я попытался ниже команду добавить некоторый путь к переменной системного пути с помощью пакетного файла:
setx PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 5.5\bin"
Я проверил путь к системной переменной после запуска над командным файлом, указанного выше пути там нет.
Вы можете увидеть все окна Variable value
содержание ниже:
C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files (x86)\AMDAPP\bin\x86;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramFiles (x86)\ATI Technologies\ATI.ACE\Core-Static;
Что я делаю неправильно?
6 ответов
Чтобы добавить ответ @Endoro (мне не хватает представителя, чтобы комментировать):
Если вы хотите изменить общесистемные переменные среды, вы должны использовать / M, а ля:
setx PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 5.5\bin" /M
setx.exe требователен к размещению /M, кстати. Это должно быть в конце.
ПРЕДУПРЕЖДЕНИЕ!
setx урезает значение до 1024 символов.
Если вы используете его для изменения PATH, вы можете испортить вашу систему.
Вы можете использовать этот фрагмент 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). Эта версия правильно обрабатывает вложенные пути. Например, он обрабатывает случай PATH, содержащий "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)}"
SETX /M Path "%PATH%;%ProgramFiles%\MySQL\MySQL Server 5.5\bin\
Это добавит ваш путь к системной переменной
Чтобы обновить и расширить ответ Endoro для Windows 10, вручную добавьте путь к системной переменной Path в качестве новой переменной. Я не мог заставить setx работать, даже меняя флаги. Сделать это вручную было просто.
Чтобы перейти к системным переменным среды -> Клавиша Windows -> Редактировать системные переменные среды -> Щелкните Переменные среды -> Выберите переменную Путь в рамке Системные переменные -> Щелкните Изменить -> Щелкните Создать -> Добавить путь -> Щелкните Хорошо
Убедитесь, что вы закрыли все окна интерфейса командной строки и открыли новое, если пытаетесь проверить, проверив версию.
Я столкнулся с той же проблемой, когда пытался добавить переменные пути, связанные с fortran (Eclipse для c/ C++/fortran)
Я попытался установить путь SETX /M "%PATH%;C:\Users\mahidhai\cygwin64\bin" в командной строке от имени администратора. Я получил предупреждение о том, что данные были усечены до 1024 символов и сохранены.
РЕШЕНИЕ: перейти к файлу реестра напрямую. Выполнить->regedit Перейти к среде
(Весь путь: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment)
Нажмите на реестр пути и добавьте переменную пути напрямую. Или удалите все повторяющиеся переменные пути.
Теперь откройте командную строку и затем выполните ту же команду setx /M path "%path%"
Переменная пути может быть связана с C или C++ или fortran
Не беспокойтесь при редактировании файла реестра, он будет сохранен навсегда, не бойтесь, так как переменные среды находятся в менеджере сеансов.