Подтвердить что ты не робот

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

Я попробовал команду ниже для добавления некоторого пути к переменной системного пути в пакетном файле:

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

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

enter image description here

Вы можете увидеть содержимое всех окон 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;

Что я делаю неправильно?

4b9b3361

Ответ 1

Чтобы ответить на вопрос @Endoro (мне не хватает комментариев для комментариев):

Если вы хотите изменить общесистемные переменные среды, вы должны использовать /M, a la:

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

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

Ответ 2

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

enter image description here

Ответ 3

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

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

Ответ 4

ВНИМАНИЕ!

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');

Ответ 5

Никогда не следует использовать 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)}"