如何从cmd永久更新PATHvariables? 视窗
如果我从cmd执行set PATH=%PATH%;C:\\Something\\bin
,然后执行echo %PATH%
我看到这个string添加在path中。 如果我closures并打开cmd,那么新的string不在PATH中。 我如何从cmd永久更新所有进程的PATH,而不仅仅是当前进程? 我不想通过进入系统属性 – >高级 – >环境variables并在那里更新PATH来做到这一点。
这个命令必须从Java应用程序执行(我的另一个问题 )。
有关如何执行此操作的文档可以在MSDN上find。 关键提取是这样的:
要以编程方式添加或修改系统环境variables,请将它们添加到HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environmentregistry项中,然后广播一个
WM_SETTINGCHANGE
消息,并将lParam设置为string“Environment”。 这使应用程序(如shell)能够获取更新。
请注意,您的应用程序需要提升pipe理权限才能修改此密钥。
您在评论中指出,您将很乐意修改每个用户的环境。 通过编辑HKEY_CURRENT_USER \ Environment中的值来完成此操作。 像以前一样,确保您广播WM_SETTINGCHANGE
消息。
您应该可以使用JNIregistry类轻松地从Java应用程序执行此操作。
您可以使用:
setx PATH "%PATH%;C:\\Something\\bin"
但是, setx
会将存储的string截断为1024个字节,可能会破坏PATH。
/M
将更改HKEY_LOCAL_MACHINE
的PATH
而不是HKEY_CURRENT_USER
。 换句话说,是一个系统variables,而不是用户的。 例如:
SETX /M PATH "%PATH%;C:\your path with spaces"
您必须记住,新的PATH在您当前的cmd.exe
不可见。
但是,如果您在registry中或使用"set p"
查看新的cmd.exe
,您可以看到新的值。
我警告不要使用该命令
setx PATH "%PATH%;C:\Something\bin"
修改PATHvariables是因为其实现的“特性”。 在许多(大多数?)安装中,variables将会很长 – setx
会将存储的string截断为1024个字节,可能会破坏PATH(请参阅此处的讨论)。
( 我特意注册了这个问题,所以缺乏网站声誉直接评论12月5日发布的答案)。感谢beresfordt添加这样的评论 )
这个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 ';' (ie 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:])
下面是一些用法示例,假设它已经保存在当前path中某个名为setenv.py
的文件中。 请注意,在这些示例中,我没有pipe理员权限 ,所以更改仅影响我本地用户的registry树:
> 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/
为了便于参考,对于通过代码search如何更改path的任何人,我从这个网页中引用了Delphi程序员的一篇有用的文章: http : //www.tek-tips.com/viewthread.cfm?qid=686382
TonHu(程序员)22 Oct 03 17:57我发现我在哪里阅读原帖,在这里: http : //news.jrsoftware.org/news/innosetup.isx/msg02129 ….
你需要的是这样的摘录:
您必须在LParam中指定string“Environment”。 在delphi你会这样做:
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
(ao)InnoSetup(“Inno Setup是Windows程序的免费安装程序”的创始人之一, http ://www.jrsoftware.org)提出了build议,Inno Setup在1997年首次推出,如今已经可以与许多其他竞争对手商业安装人员在function设置和稳定性。“)(我只是想更多的人使用InnoSetup)
HTH
这个脚本http://www.autohotkey.com/board/topic/63210-modify-system-path-gui/
包括所有必要的Windows API调用,可以根据您的需要进行重构。 它实际上是一个AutoHotkeygraphics用户界面,可以轻松更改系统path。 需要以pipe理员身份运行。
在企业networking中,用户只有有限的访问权限并使用便携式应用程序,这些命令行技巧有:
- 查询用户的envvariables:
reg query "HKEY_CURRENT_USER\Environment"
。 为LOCAL_MACHINE使用"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
。 - 添加新的用户envvariables:
reg add "HKEY_CURRENT_USER\Environment" /v shared_dir /d "c:\shared" /t REG_SZ
。 使用REG_EXPAND_SZ
包含其他%%variables的path。 - 删除现有的envvariables:
reg delete "HKEY_CURRENT_USER\Environment" /v shared_dir
。