SETX不会将path追加到系统pathvariables

我试过下面的命令,通过batch file追加一些path到系统pathvariables:

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

在运行上面的batch file之后,我检查了系统variablespath,上面的path不在那里。

在这里输入图像说明

您可以在下面看到所有的窗口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; 

我究竟做错了什么?

Solutions Collecting From Web of "SETX不会将path追加到系统pathvariables"

回复@ Endoro的回答(我缺乏评论):

如果要更改系统范围的环境变量,则必须使用/ M ,a la:

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

setx.exe对/ M,BTW的位置是挑剔的。 它需要在最后。

你不应该看看系统环境变量,而是看你的用户环境变量:

在这里输入图像说明

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

它会将你的路径附加到系统变量

警告!

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)。 此版本正确处理嵌套的路径。 例如,它处理包含“c:\ tool \ foo”的PATH的情况,并且想要添加“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)}"