SETX不会将路径附加到系统路径变量

时间:2013-06-21 17:07:02

标签: windows batch-file cmd system-variable 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;

我做错了什么?

7 个答案:

答案 0 :(得分:29)

捎带@Endoro的回答(我没有回复评论):

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

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

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

答案 1 :(得分:7)

警告!

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

答案 2 :(得分:6)

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

enter image description here

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

永远不要将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)}"

答案 5 :(得分:0)

当我尝试添加与fortran(Eclipse for c / c ++ / fortran)相关的路径变量时,我遇到了同样的问题

我尝试过 SETX / M路径“%PATH%; C:\ Users \ mahidhai \ cygwin64 \ bin” 在命令提示符下,以管理员身份。我得到警告说 数据被截断为1024个字符并存储。

解决方案: 直接转到注册表文件。 运行-> regedit 导航到环境

(整个路径:HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment)

单击路径注册表,然后直接添加路径变量。 或删除任何重复的路径变量。

现在,打开命令提示符,然后运行相同的命令 setx / M路径“%path%,”

路径变量可能与C或C ++或fortran相关

不用担心编辑注册表文件,它将永久保存,不要担心环境变量在会话管理器中。

答案 6 :(得分:0)

要更新和扩展Endoro对于Windows 10的答案,请手动将路径添加到Path系统变量中作为新变量。即使更改标志,我也无法使setx工作。手动进行很简单。

要获取系统环境变量-> Windows键->编辑系统环境变量->单击环境变量->在系统变量框架中选择路径变量->单击编辑->单击新建->添加路径->单击确定

如果要通过检查版本进行验证,请确保关闭所有CLI窗口并打开一个新窗口。

Windows showing where to edit the Path environmental variable

相关问题