SETX не добавляет путь к системной переменной path
Я попытался ниже команды, чтобы добавить некоторый путь к переменной системного пути с помощью пакетного файла:
setx PATH "%PATH%;C:Program FilesMySQLMySQL Server 5.5bin"
Я проверил путь к системной переменной после запуска выше пакетного файла, выше пути там нет.
вы можете увидеть все окна 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, кстати. Это должно быть в конце.
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
Не беспокойтесь при редактировании файла реестра, он будет сохранен навсегда, не бойтесь, поскольку переменные среды находятся в диспетчере сеансов.