使用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()
相关推荐
Code成立3 分钟前
《Java核心技术 卷I》用户图形界面鼠标事件
java·开发语言·计算机外设
赛丽曼14 分钟前
Python中的HTML
python·html
luky!22 分钟前
算法--解决熄灯问题
python·算法
Xiao Fei Xiangζั͡ޓއއ23 分钟前
一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数
c语言·开发语言·笔记·程序人生·面试·蓝桥杯·学习方法
记录无知岁月25 分钟前
【MATLAB】目标检测初探
开发语言·yolo·目标检测·matlab·yolov3·yolov2
深度学习lover36 分钟前
<项目代码>YOLOv8 番茄识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·番茄识别
IT古董36 分钟前
【机器学习】机器学习中用到的高等数学知识-1.线性代数 (Linear Algebra)
人工智能·python·线性代数·机器学习
远望清一色39 分钟前
基于MATLAB身份证号码识别
开发语言·图像处理·算法·matlab
生信与遗传解读41 分钟前
基于python的线性代数相关计算
python·线性代数·机器学习
NMBG221 小时前
[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决
java·开发语言·面试·java-ee·intellij-idea