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

Posted

技术标签:

【中文标题】SETX 不会将路径附加到系统路径变量【英文标题】:SETX doesn't append path to system path variable 【发布时间】:2013-06-18 21:48:25 【问题描述】:

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

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;

我做错了什么?

【问题讨论】:

使用/m 开关将路径添加到系统路径变量而不是用户路径变量。见setx 我相信此解决方案会将系统路径的副本放入用户路径中,因为 %PATH% 扩展为系统路径 + 用户路径,即对于系统路径 s,用户路径 u,然后是 setx PATH %PATH%;c:\foo 将导致用户路径 = s;u;c:\foo,因此 %PATH%== s;s;u;c:\foo。 在大多数答案中,新值都是用SETX "%PATH%" /m 设置的,但是如果PATH 在两个系统路径(HKLM)中都有值,@Wil S 指出的问题仍然存在和用户路径(HKLU)。有些程序在安装时会设置 HKLU-PATH。为避免任何重复,您应该使用 REG QUERY 获取 PATH 值,然后添加新值。 【参考方案1】:

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

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

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

Windows showing where to edit the Path environmental variable

【讨论】:

【参考方案2】:

警告!

setx 会将值截断为 1024 个字符。

如果你用它来修改 PATH,你可能会弄乱你的系统。

您可以使用此 PowerShell sn-p 向您的路径添加一些内容:

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

【讨论】:

我必须为变量machine 使用什么?是我电脑的名字吗? 'machine' 是一个常量字符串,而不是一个变量。 应用了beau提出的改进建议 注册表中的原始“Path”值通常取决于其他系统变量(例如%SystemRoot%)和系统环境中的其他独立值。 (REG_SZ 值不依赖于其他变量,与 REG_EXPAND_SZ 值不同。REG_SZ 值在重新加载环境时首先加载,因此它们在PATH 中使用是安全的。)不幸的是GetEnvironmentVariable扩展它们,从而丢失有用的信息。这将获取原始系统值:(get-item "HKLM:\System\CurrentControlSet\Control\Session Manager\Environment").GetValue("PATH", $null, "DoNotExpandEnvironmentNames") @ErykSun 您是否有一个使用您的修改且不扩展路径值的有效 PS1 脚本?【参考方案3】:

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

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

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

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

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

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

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

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

【讨论】:

【参考方案4】:

不应该使用 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】:
SETX /M Path "%PATH%;%ProgramFiles%\MySQL\MySQL Server 5.5\bin\

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

【讨论】:

【参考方案6】:

附在@Endoro 的回答上(我缺少评论的代表):

如果你想改变系统范围的环境变量,你必须使用/M,一个啦:

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

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

【讨论】:

SETX 设置超过 1024 个字符是否失败?当我执行 SETX PATH "%PATH%;C:\Temp" 时,它完成了这项工作(对于 1024 个字符),但也警告:正在保存的数据被截断为 1024 个字符。有什么办法绕过它?我想通过编辑注册表来实现它。 编辑注册表还不错。它唯一不做的就是发送WM_SETTINGSCHANGE 消息。您始终可以设置注册表值,然后使用 setx 设置/取消设置一些无意义的值。 @kalehv:很确定在这种情况下限制不是setx本身。例如,Windows 上的命令行大小限制比 Linux 上要严格得多。 我还必须在新路径可用之前启动一个新的命令提示符窗口。 SETX 更改全局环境变量,但进程必须检查它是否已更新。 CMD.EXE 从不检查。要更改 CMD 中的变量,请使用 SET(例如 SET "PATH=%PATH%;C:\path\to\bin\dir"【参考方案7】:

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

【讨论】:

你如何到达那个窗口? @ReversedEngineer 右击“这台电脑”>点击“属性”>在弹出的窗口左侧面板上,点击“高级系统设置”>点击“高级”选项卡> 点击窗口底部的“环境变量”按钮。

以上是关于SETX 不会将路径附加到系统路径变量的主要内容,如果未能解决你的问题,请参考以下文章

如何添加环境变量或路径添加到系统的Path里面

如何添加环境变量或路径添加到系统的Path里面

如何添加环境变量或路径添加到系统的Path里面

将文件夹附加到所有视图路径

系统找不到指定的路径

将Python的库路径添加到系统环境变量PYTHONPATH中,如python安装在C:PYTHO