使用Python+winreg修改/重命名Windows注册表的键

一、修改/重命名Windows注册表的键的步骤

1. 使用新的键名创建新的键

2. 获取旧键中的所有数据(包括键的默认值、键中所有的值、键中的子健等)

3. 将旧键中的所有数据复制到新键中

4. 删除旧键

二、使用Python+winreg修改/重命名Windows注册表的键

python 复制代码
import winreg


def rename_key(old_key_path, new_key_name):
    """
    修改注册表的key名称
    :param old_key_path: 旧key路径
    :param new_key_name: 新key名称
    :return:
    """

    # 打开旧key
    old_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, old_key_path)

    # 获取旧key的信息
    key_info = winreg.QueryInfoKey(old_key)

    # 获取旧key的所有值和类型
    values = {}
    for i in range(key_info[1]):

        value_name, value_data, value_type = winreg.EnumValue(old_key, i)

        values[value_name] = (value_data, value_type)

    # 创建新key
    new_key_path = old_key_path.rsplit('\\', 1)[0] + '\\' + new_key_name

    new_key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, new_key_path)

    # 复制旧key的所有键值到新key
    try:
        for i in range(1024):

            name, value, type_ = winreg.EnumValue(old_key, i)

            winreg.SetValueEx(new_key, name, 0, type_, value)

    except WindowsError as e:
        pass

    # 将旧key中所有子项复制到新key中
    for i in range(key_info[0]):

        sub_key_name = winreg.EnumKey(old_key, i)
        sub_key_path = old_key_path + '\\' + sub_key_name
        sub_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, sub_key_path)
        sub_key_info = winreg.QueryInfoKey(sub_key)
        sub_new_key_path = new_key_path + '\\' + sub_key_name
        sub_new_key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, sub_new_key_path)

        # 将子项中所有值复制到新子项中
        for j in range(sub_key_info[1]):

            value_name, value_data, value_type = winreg.EnumValue(sub_key, j)

            winreg.SetValueEx(sub_new_key, value_name, 0, value_type, value_data)

        # 关闭子项句柄
        sub_new_key.Close()
        sub_key.Close()

    # 关闭旧key句柄
    old_key.Close()

    # 删除旧key
    winreg.DeleteKey(winreg.HKEY_CURRENT_USER, old_key_path)

def test_rename_key():

    # 创建一个测试key
    test_key_path = r'Software\test_key'

    test_key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, test_key_path)

    winreg.SetValueEx(test_key, 'test_value', 0, winreg.REG_SZ, 'test_data')

    # 测试rename_key函数
    rename_key(test_key_path, 'new_test_key')

    # 检查新key是否存在
    try:
        new_test_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\new_test_key')

        new_test_value = winreg.QueryValueEx(new_test_key, 'test_value')[0]

        assert new_test_value == 'test_data'
        print('测试通过')

    except Exception as e:
        print('测试失败:', e)

    # 删除测试key
    winreg.DeleteKey(winreg.HKEY_CURRENT_USER, r'Software\new_test_key')

test_rename_key()
相关推荐
Mr_sun.36 分钟前
Day09——入退管理-入住-2
android·java·开发语言
MAGICIAN...1 小时前
【java-软件设计原则】
java·开发语言
gpfyyds6661 小时前
Python代码练习
开发语言·python
盐真卿1 小时前
python第八部分:高级特性(二)
java·开发语言
茉莉玫瑰花茶1 小时前
C++ 17 详细特性解析(5)
开发语言·c++·算法
lly2024061 小时前
《堆的 shift down》
开发语言
黎雁·泠崖2 小时前
【魔法森林冒险】2/14 抽象层设计:Figure/Person类(所有角色的基石)
java·开发语言
雨中风华2 小时前
Linux, macOS系统实现远程目录访问(等同于windows平台xFsRedir软件的目录重定向)
linux·windows·macos
aiguangyuan2 小时前
使用LSTM进行情感分类:原理与实现剖析
人工智能·python·nlp
季明洵2 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表