如何从cmd永久更新PATH变量?视窗

val*_*674 117 java windows cmd path

如果我set PATH=%PATH%;C:\\Something\\bin从cmd 执行然后执行cmd.exe我看到在路径中添加了这个字符串.如果我关闭并打开cmd,则该新字符串不在PATH中.如何在将来从cmd为所有进程永久更新PATH,而不仅仅是针对当前进程?我不想通过转到系统属性 - >高级 - >环境变量来执行此操作,并且更新PATH.

必须从java应用程序执行此命令(我的另一个问题).

pan*_*nny 145

您可以使用:

setx PATH "%PATH%;C:\\Something\\bin"
Run Code Online (Sandbox Code Playgroud)

但是,setx会将存储的字符串截断为1024字节,从而可能破坏PATH.

/M将改变PATHin HKEY_LOCAL_MACHINE而不是HKEY_CURRENT_USER.换句话说,系统变量,而不是用户的.例如:

SETX /M PATH "%PATH%;C:\your path with spaces"
Run Code Online (Sandbox Code Playgroud)

您必须记住,新的PATH在您当前不可见cmd.exe.

但是,如果您查看注册表或新的cmd.exe,"set p"您可以看到新值.

  • @KilgoreCod评论:我警告不要使用命令:在许多(大多数?)安装这些天PATH变量将是冗长的--setx会将存储的字符串截断为1024字节,可能会破坏PATH(请参阅此处的讨论http:// superuser.com/q/812754). (12认同)
  • 从[这里](http://ss64.com/nt/setx.html)你可以告诉它可以设置一个变量,不仅可以为当前登录的用户设置变量,还可以为机器设置变量,方法是使用`/ m`命令的结尾,在Windows XP和7上.我还没试过. (4认同)
  • 有没有办法使用`setx`来改变机器的路径而不是用户的路径? (2认同)
  • 我尝试回显已经超过1200bytes的路径。还有其他方法来代替setx吗? (2认同)

Dav*_*nan 42

有关如何执行此操作的文档可以在MSDN上找到.关键提取是这样的:

若要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment注册表项,然后广播一条WM_SETTINGCHANGE消息,并将lParam设置为字符串"Environment".这允许应用程序(如shell)获取更新.

请注意,您的应用程序需要提升管理员权限才能修改此密钥.

您在评论中表明您很乐意仅修改每用户环境.通过编辑HKEY_CURRENT_USER\Environment中的值来执行此操作.和以前一样,确保广播WM_SETTINGCHANGE消息.

您应该能够使用JNI注册表类轻松地从Java应用程序执行此操作.


小智 36

我提醒不要使用该命令

setx PATH "%PATH%;C:\Something\bin"
Run Code Online (Sandbox Code Playgroud)

修改PATH变量,因为它的实现的"功能".在许多(大多数?)安装这些天变量将是冗长的 - setx将截断存储的字符串为1024字节,可能破坏PATH(请参阅此处的讨论).

(我专门报名参加了这个问题,所以缺乏网站声誉直接评论12月5日发布的答案.感谢beresfordt添加这样的评论)


ank*_*tis 9

这个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:])
Run Code Online (Sandbox Code Playgroud)

下面是一些使用示例,假设它已保存在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
Run Code Online (Sandbox Code Playgroud)

[*]改编自:http://code.activestate.com/recipes/416087-persistent-environment-variables-on-windows/