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 -> Редактировать системные переменные среды -> Щелкните Переменные среды -> Выберите переменную Путь в рамке Системные переменные -> Щелкните Изменить -> Щелкните Создать -> Добавить путь -> Щелкните Хорошо

Убедитесь, что вы закрыли все окна интерфейса командной строки и открыли новое, если пытаетесь проверить, проверив версию.

Окна, показывающие, где изменить переменную среды Path

Я столкнулся с той же проблемой, когда пытался добавить переменные пути, связанные с 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

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

Другие вопросы по тегам