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 不会将路径附加到系统路径变量的主要内容,如果未能解决你的问题,请参考以下文章