29

我尝试使用以下命令通过批处理文件将一些路径附加到系统路径变量:

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;

我究竟做错了什么?

4

7 回答 7

32

背负@Endoro的回答(我缺乏评论的代表):

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

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

setx.exe 对 /M 的位置很挑剔,顺便说一句。它必须在最后。

于 2013-06-22T04:18:00.627 回答
16

警告!

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”的情况。

请注意,这会扩展路径中的值并将它们保存回来展开。如果您想避免这种情况,请查看下面@ErykSun 的评论。

$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');
于 2016-05-18T16:00:10.903 回答
6

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

在此处输入图像描述

于 2013-06-21T18:57:50.800 回答
5
SETX /M Path "%PATH%;%ProgramFiles%\MySQL\MySQL Server 5.5\bin\

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

于 2014-05-11T17:30:27.630 回答
4

如前所述,不应将 setx 用于路径,因为它限制为 1024 个字符。

可以使用 reg 添加:

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)}"
于 2017-01-25T11:31:37.043 回答
0

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

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

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

显示在何处编辑 Path 环境变量的窗口

于 2020-09-09T16:17:52.123 回答
0

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

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

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

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

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

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

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

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

于 2018-08-28T11:06:04.183 回答