如果我从cmd执行set PATH=%PATH%;C:\\Something\\bin
然后执行echo %PATH%
,我会在路径中看到这个字符串。如果我关闭并打开cmd,则该新字符串不在PATH中。如何在将来从cmd为所有进程永久更新PATH,而不仅仅是针对当前进程?
我不想通过转到系统属性 - >来做到这一点。高级 - >环境变量并有更新PATH。
此命令必须从java应用程序(我的其他question)执行。
答案 0 :(得分:143)
您可以使用:
setx PATH "%PATH%;C:\\Something\\bin"
但是,setx
会将存储的字符串截断为1024字节,从而可能破坏PATH。
/M
会更改PATH
中的HKEY_LOCAL_MACHINE
而不是HKEY_CURRENT_USER
。换句话说,系统变量,而不是用户的。例如:
SETX /M PATH "%PATH%;C:\your path with spaces"
您必须记住,新的PATH在您当前的cmd.exe
中不可见。
但是,如果您查看注册表或新cmd.exe
"set p"
,您可以看到新值。
答案 1 :(得分:41)
有关如何执行此操作的文档可在MSDN上找到。关键提取是:
以编程方式添加或修改系统环境变量,将它们添加到 HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment 注册表项,然后使用lParam设置广播
WM_SETTINGCHANGE
消息到字符串“Environment”。这允许应用程序(如shell)获取更新。
请注意,您的应用程序需要提升管理员权限才能修改此密钥。
您在评论中指出,您很乐意仅修改每个用户的环境。通过编辑 HKEY_CURRENT_USER \ Environment 中的值来执行此操作。和以前一样,请确保广播WM_SETTINGCHANGE
消息。
您应该可以使用JNI注册表类轻松地从Java应用程序执行此操作。
答案 2 :(得分:35)
我提醒您不要使用命令
setx PATH "%PATH%;C:\Something\bin"
修改PATH变量,因为"功能"其实施。如今,在许多(大多数?)安装中,变量将很长 - setx
会将存储的字符串截断为1024字节,从而可能破坏PATH(请参阅讨论here)。
(我专门注册以标记此问题,因此缺乏网站声誉直接评论5月2日发布的答案'我感谢beresfordt添加此类评论)
答案 3 :(得分:7)
这个Python脚本[*]正是这样做的:
"""
Show/Modify/Append registry env-vars (ie `PATH`) and notify Windows-applications to pickup changes.
First attempts to show/modify HKEY_LOCAL_MACHINE (all users), and
if not accessible due to admin-rights missing, fails-back
to HKEY_CURRENT_USER.
Write and Delete operations do not proceed to user-tree if all-users succeed.
Syntax:
{prog} : Print all env-vars.
{prog} VARNAME : Print value for VARNAME.
{prog} VARNAME VALUE : Set VALUE for VARNAME.
{prog} +VARNAME VALUE : Append VALUE in VARNAME delimeted with ';' (i.e. used for `PATH`).
{prog} -VARNAME : Delete env-var value.
Note that the current command-window will not be affected,
changes would apply only for new command-windows.
"""
import winreg
import os, sys, win32gui, win32con
def reg_key(tree, path, varname):
return '%s\%s:%s' % (tree, path, varname)
def reg_entry(tree, path, varname, value):
return '%s=%s' % (reg_key(tree, path, varname), value)
def query_value(key, varname):
value, type_id = winreg.QueryValueEx(key, varname)
return value
def yield_all_entries(tree, path, key):
i = 0
while True:
try:
n,v,t = winreg.EnumValue(key, i)
yield reg_entry(tree, path, n, v)
i += 1
except OSError:
break ## Expected, this is how iteration ends.
def notify_windows(action, tree, path, varname, value):
win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')
print("---%s %s" % (action, reg_entry(tree, path, varname, value)), file=sys.stderr)
def manage_registry_env_vars(varname=None, value=None):
reg_keys = [
('HKEY_LOCAL_MACHINE', r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'),
('HKEY_CURRENT_USER', r'Environment'),
]
for (tree_name, path) in reg_keys:
tree = eval('winreg.%s'%tree_name)
try:
with winreg.ConnectRegistry(None, tree) as reg:
with winreg.OpenKey(reg, path, 0, winreg.KEY_ALL_ACCESS) as key:
if not varname:
for regent in yield_all_entries(tree_name, path, key):
print(regent)
else:
if not value:
if varname.startswith('-'):
varname = varname[1:]
value = query_value(key, varname)
winreg.DeleteValue(key, varname)
notify_windows("Deleted", tree_name, path, varname, value)
break ## Don't propagate into user-tree.
else:
value = query_value(key, varname)
print(reg_entry(tree_name, path, varname, value))
else:
if varname.startswith('+'):
varname = varname[1:]
value = query_value(key, varname) + ';' + value
winreg.SetValueEx(key, varname, 0, winreg.REG_EXPAND_SZ, value)
notify_windows("Updated", tree_name, path, varname, value)
break ## Don't propagate into user-tree.
except PermissionError as ex:
print("!!!Cannot access %s due to: %s" %
(reg_key(tree_name, path, varname), ex), file=sys.stderr)
except FileNotFoundError as ex:
print("!!!Cannot find %s due to: %s" %
(reg_key(tree_name, path, varname), ex), file=sys.stderr)
if __name__=='__main__':
args = sys.argv
argc = len(args)
if argc > 3:
print(__doc__.format(prog=args[0]), file=sys.stderr)
sys.exit()
manage_registry_env_vars(*args[1:])
以下是一些使用示例,假设它已保存在当前路径中某个名为setenv.py
的文件中。
请注意,在这些示例中,我没有管理员权限,因此更改仅影响我本地用户的注册表树:
> REM ## Print all env-vars
> setenv.py
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
HKEY_CURRENT_USER\Environment:PATH=...
...
> REM ## Query env-var:
> setenv.py PATH C:\foo
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
!!!Cannot find HKEY_CURRENT_USER\Environment:PATH due to: [WinError 2] The system cannot find the file specified
> REM ## Set env-var:
> setenv.py PATH C:\foo
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Set HKEY_CURRENT_USER\Environment:PATH=C:\foo
> REM ## Append env-var:
> setenv.py +PATH D:\Bar
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Set HKEY_CURRENT_USER\Environment:PATH=C:\foo;D:\Bar
> REM ## Delete env-var:
> setenv.py -PATH
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment:PATH due to: [WinError 5] Access is denied
---Deleted HKEY_CURRENT_USER\Environment:PATH
[*]改编自:http://code.activestate.com/recipes/416087-persistent-environment-variables-on-windows/
答案 4 :(得分:3)
为了参考,对于任何搜索如何通过代码更改路径的人,我在这个网页上引用Delphi程序员的一篇有用的帖子:http://www.tek-tips.com/viewthread.cfm?qid=686382
TonHu(程序员)08年10月22日17:57我找到了我读原文的地方 发布,它在这里: http://news.jrsoftware.org/news/innosetup.isx/msg02129 ....
你需要的摘录如下:
您必须在LParam中指定字符串“Environment”。在德尔福,你会 这样做:
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
Jordan Russell建议,http://www.jrsoftware.org, (a.o.)InnoSetup的作者,(“Inno Setup是一个免费的安装程序 Windows程序。 Inno Setup于1997年首次推出,今天是竞争对手 甚至超过了许多功能集和商业安装人员 稳定性。“)(我希望更多人使用InnoSetup)
HTH
答案 5 :(得分:3)
在公司网络中,用户只能访问受限并使用便携式应用程序,但有以下命令行技巧:
reg query "HKEY_CURRENT_USER\Environment"
。将"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
用于LOCAL_MACHINE。reg add "HKEY_CURRENT_USER\Environment" /v shared_dir /d "c:\shared" /t REG_SZ
。对包含其他%%变量的路径使用REG_EXPAND_SZ
。reg delete "HKEY_CURRENT_USER\Environment" /v shared_dir
。答案 6 :(得分:2)
这个脚本 http://www.autohotkey.com/board/topic/63210-modify-system-path-gui/
包含所有必要的Windows API调用,可以根据需要进行重构。它实际上是一个AutoHotkey GUI,可以轻松更改系统路径。需要以管理员身份运行。