python - 通过 Python winreg 在注册表中设置 Windows 系统 PATH

标签 python windows registry

我编写了一个程序,通过注册表将目录添加到 PATH 变量,HKCU(用户)或 HKLM(系统)路径,具体取决于输入选项。

它在使用用户路径时工作正常。 但是,在为系统设置路径时,Windows 的行为就好像路径变量是空的,例如

'notepad' 未被识别为内部或外部命令....

然而,echo %path% 正确地打印出所有内容,没有任何语法错误。同样,如果我在系统属性 GUI 中查看变量,它会适本地显示我的完整路径,例如

%SystemRoot%\system32;%SystemRoot%;

现在,如果我在 GUI 中手动打开该变量,并添加或删除结尾的分号(即进行明显但看似不相关的更改),那么该路径似乎工作正常。

是的,我正在打开一个新的命令窗口来检查路径。重启机器似乎也没有做任何事情。

有什么想法吗?

代码摘录在这里:

import _winreg as registry

#HKEY_LOCAL_MACHINE\
SYS_ENV_SUBPATH = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

#HKEY_CURRENT_USER\
USR_ENV_SUBPATH = r"Environment"

def update_reg_path_value(paths_to_add,privilege):
    env_key = open_env_registry_key(privilege)
    current_path = get_path_from_registry_or_create(env_key)
    val_string = create_new_path_value(current_path, paths_to_add)
    registry.SetValueEx(env_key,"Path",0,registry.REG_SZ,val_string)


def open_env_registry_key(privilege):
    if privilege == 'system':
        return registry.OpenKey(registry.HKEY_LOCAL_MACHINE,SYS_ENV_SUBPATH,
                            0,registry.KEY_ALL_ACCESS)
    return registry.OpenKey(registry.HKEY_CURRENT_USER,USR_ENV_SUBPATH,
                        0,registry.KEY_ALL_ACCESS)

最佳答案

如评论中所述,将 REG_SZ 更改为 REG_EXPAND_SZ 就可以了,因为使用“%”的变量未被识别。这在不存在“%”时也有效,因此我也将它用于用户路径,而不需要在两者之间切换。

registry.SetValueEx(env_key,"Path",0,registry.REG_EXPAND_SZ,val_string)

关于python - 通过 Python winreg 在注册表中设置 Windows 系统 PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38516044/

相关文章:

c# - 查询 Windows 服务是否被禁用(不使用注册表)?

python - 拆分多个(嵌套的)python 子正则表达式定义

python - Tensorflow 导入错误

c# - 以 C#.Net 形式托管进程会禁用某些进程的按钮

Windows 内核 - 是否有类似 ExGetPoolsForTag(pool_tag) 的东西?

javascript - 检查用户计算机上是否安装了 .net 4 客户端配置文件

visual-studio-2008 - 在 Windows 7 x64 中找不到 VS2008 installdir 注册表

python异常属性错误: "' NoneType' object has no attribute 'var' "

python - 变量未记录值的变化

c# - 你会如何开始自动化我的工作? - 第2部分