2024-08-26 更改驱动器号导致的软件崩溃问题

​ 在给电脑重新分盘时,想把 Software 盘的驱动器号(E:)改为对应的首字母 S,因此导致了所有软件崩溃。主要原因是软件主要依据驱动器号识别位置,而更改驱动器号后,并不会将软件设置的驱动器号一并更改。

​ 解决办法有如下两个:

  1. 删除原有软件文件夹,重装一遍。
  2. 手动更改注册表,将 E:\ 改为 S:\。

​ 两个方案的工作量都不小:

  • 方案一的缺点是,注册表中原有的记录不会被删除,在操作电脑时会偶尔弹出一些无图标的选项很烦人。
  • 方案二的缺点是,难以更改完全,因为不清楚每个软件安装和使用时都向注册表写了些什么东西。。。

​ 这里介绍一下方案二的解决办法,但也并不是很好的方案。

1 手动替换

​ win11下,点击 win 按键,搜索框里搜索“注册表”,打开“注册表编辑器”后,点击左上角“编辑 -> 查找”选项,搜索更改前的盘符,点击“查找下一个。此处我输入 “E:\”。

image-20240826005740290

​ 可以看到,搜索到了一个结果,即软件安装时写入的注册表数据。双击“URL Protocol”,将其手动替换为“S:\BcutBilibili\Bcut.exe”。

2 Python 替换

​ 手动替换效率过慢,因此使用 Python 来自动替换。给出如下示例代码。

​ 注意:在运行代码时,需要右键点击 Python 或 IDE 图标(如 PyCharm、VS Code),并选择“以管理员身份运行”。否则,会抛出错误:[WinError 5] 拒绝访问

import re
import winreg as regdef replace_all(old_drive_pattern, new_drive, access_flag=0):# 打开注册表根键replace_root(reg.HKEY_CLASSES_ROOT, "HKEY_CLASSES_ROOT", "", old_drive_pattern, new_drive, access_flag)replace_root(reg.HKEY_CURRENT_USER, "HKEY_CURRENT_USER", "", old_drive_pattern, new_drive, access_flag)replace_root(reg.HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", "", old_drive_pattern, new_drive, access_flag)replace_root(reg.HKEY_USERS, "HKEY_USERS", "", old_drive_pattern, new_drive, access_flag)replace_root(reg.HKEY_CURRENT_CONFIG, "HKEY_CURRENT_CONFIG", "", old_drive_pattern, new_drive, access_flag)def replace_root(root_key, root_name, key_path, old_drive_pattern, new_drive, access_flag=0):try:# 打开注册表键reg_key = reg.OpenKey(root_key, key_path, 0, reg.KEY_READ | reg.KEY_WRITE | access_flag)# 遍历所有值i = 0while True:try:value_name, value_data, value_type = reg.EnumValue(reg_key, i)# 处理 REG_SZ 和 REG_EXPAND_SZ 类型的值if value_type == reg.REG_SZ or value_type == reg.REG_EXPAND_SZ:if re.search(old_drive_pattern, value_data):new_value_data = re.sub(old_drive_pattern, new_drive, value_data)reg.SetValueEx(reg_key, value_name, 0, value_type, new_value_data)print(f"{root_name}\\{key_path}\\{value_name}:\n{value_data}\n修改为 -> {new_value_data}\n")# 处理 REG_MULTI_SZ 类型的值elif value_type == reg.REG_MULTI_SZ:new_value_data = []modified = Falsefor item in value_data:if re.search(old_drive_pattern, item):new_value_data.append(re.sub(old_drive_pattern, new_drive, item))modified = Trueelse:new_value_data.append(item)if modified:reg.SetValueEx(reg_key, value_name, 0, value_type, new_value_data)print(f"{root_name}\\{key_path}\\{value_name}:\n{value_data}\n修改为 -> {new_value_data}\n")# 替换键名if re.search(old_drive_pattern, value_name):reg.DeleteValue(reg_key, value_name)  # 删除旧的键值对new_name = re.sub(old_drive_pattern, new_drive, value_name)reg.SetValueEx(reg_key, new_name, 0, value_type, value_data)  # 创建新的键值对,保留值不变,仅更改键名print(f"{root_name}\\{key_path}:\n修改了键名: {value_name}\n修改为 -> {new_name}\n")i += 1except OSError:break# 遍历子键i = 0while True:try:subkey_name = reg.EnumKey(reg_key, i)subkey_path = f"{key_path}\\{subkey_name}"if key_path == "":  # 根目录不添加反斜杠 \subkey_path = subkey_namereplace_root(root_key, root_name, subkey_path, old_drive_pattern, new_drive, access_flag)i += 1except OSError:breakreg.CloseKey(reg_key)except PermissionError:# print(f"没有权限访问键: {key_path}")passexcept FileNotFoundError:# print(f"未找到键: {key_path}")passexcept Exception as e:# print(f"无法打开键: {key_path}, 错误: {e}")pass# 正则表达式模式,仅匹配以"E:\"开头的路径,确保盘符后面直接跟随的是反斜杠
old_drive_pattern = r"(?<![A-Z])E:\\"# 设置新盘符
new_drive = r"S:\\"# 访问 64 位注册表视图
access_flag = reg.KEY_WOW64_64KEY# replace_root(reg.HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE", "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders", old_drive_pattern, new_drive, access_flag)
replace_all(old_drive_pattern, new_drive, access_flag)print("所有修改完成。")

2.1 注册表数据说明

​ 需要修改的注册表的数据分为以下几种:

  1. REG_SZ:字符串类型(单行)。
  1. REG_EXPAND_SZ:可延展字符串,即字符串中含有其他变量的值,类似 C# 内插字符串。
image-20240826012350274
  1. REG_MULTI_SZ:字符串类型(多行)。
image-20240826012434887

​ 在 replace_root() 函数中,对每种类型进行了分类处理。主要过程还是字符串的匹配替换,以及注册表的读取和写入。

  • REG_SZ 和 REG_EXPAND_SZ:

    在程序中,对应的 value_data 为字符串,直接匹配替换即可。

  • REG_MULTI_SZ:

    在程序中,对应的 value_data 为字符串列表,需要遍历其中的字符串进行匹配替换。

  • 键名:

    在程序中,value_name 也是字符串,直接匹配替换即可。

2.2 正则匹配

​ 使用正则匹配:old_drive_pattern = r"(?<![A-Z])E:\\"(?<![A-Z]) 是一个负向前瞻断言,确保在 E: 之前没有大写字母。防止像 "SOME:\XXX" 类似情况被匹配。

2.3 其他

  1. 推荐最好先进行测试,并备份注册表,以防出错。测试时可将 92 行取消注释,并注释 93 行。在 92 行指定测试的路径,这样即便出错,也仅是小范围,方便更改回来。
  2. 测试通过时,建议程序多运行几次,以更改完全。
  3. 可以根据具体需求更改正则匹配。
  4. 注册表部分内容在程序运行时不允许更改,需重启电脑后才能生效。
  5. 完成注册表修改后,先测试相关软件或功能是否按预期运行。如果没有生效,再考虑重启。如果不确定某些系统配置的更改是否需要重启,重启电脑可以确保所有更改生效。

3 图标问题

​ 对于桌面上已经失效的图标,只有一个个手动更改路径了。

​ 或者将其删除,然后新创建桌面快捷方式,但也需要一个个创建。

4 总结

​ 最好是不要替换盘符,新电脑分区时一旦确定后就不要更改,因为永远不清楚安装的什么软件在什么时候向注册表写了哪些东西。

​ 花了快 2 天时间,初步解决问题。但不清楚后续可能发生什么其他问题,遇到了再说吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

车载通信框架--- 以太网重连Port口相关思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

手机mkv转换mp4:轻松实现视频格式兼容

如今手机已成为我们日常生活中不可或缺的伴侣&#xff0c;而视频文件则是我们享受娱乐、获取信息的重要来源。然而&#xff0c;由于不同设备和平台对视频格式的支持各有不同&#xff0c;我们有时会遇到无法在手机上播放某些视频文件的问题。 mkv是一种常见的视频格式&#xff…

java接口 controller层接收list集合传参,postman 调用接口时required parameter XXX is not present

开发过程中开发一个java接口 controller层接收list集合传参&#xff0c;然后postman调用一直不成功&#xff0c;报错 使用RequestParam方式&#xff0c;如果postman 调用接口时报错required parameter XXX is not present 可能是&#xff08;value“items”&#xff09;跟你输…

A Neural Probabilistic Language Model

摘要 统计语言建模的一个目标是学习单词序列的联合概率函数。由于维度的诅咒&#xff0c;这在本质上是困难的:我们建议用它自己的武器来对抗它。在提出的方法中&#xff0c;人们同时学习(1)每个单词的分布式表示&#xff08;词向量&#xff09;(即单词之间的相似性)以及(2)表示…

在进行网站链接时,‌加上http或https的重要性不言而喻

这一简单的操作背后&#xff0c;‌蕴含着对搜索引擎优化&#xff08;‌SEO&#xff09;‌的深刻理解&#xff0c;‌以及对网站权重提升的精准把握。‌以下&#xff0c;‌我们将深入探讨这一话题&#xff0c;‌以期为您的网站优化提供有价值的参考。‌优化&#xff08;‌SEO&…

C/C++控制台贪吃蛇游戏的实现

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 一、…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件&#xff0c;不仅擅长构建交互式界面&#xff0c;更在数据可视化方面展现出了非凡的创意与实用性。今天&#xff0c;就让我们一起探索Axure设计的几款精美数据可视化大屏模板&#xff0c;感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…

银河麒麟桌面操作系统V10:如何设置应用开机自启动?

银河麒麟桌面操作系统V10&#xff1a;如何设置应用开机自启动&#xff1f; 1、图形界面设置2、命令行设置3、注意 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、图形界面设置 打开“设置”->“系统”->“开机启动”。点击“添加…

5000套精美PPT免费分享

目录 部分展示目录 几乎包含各种应用场景的PPT模板 这里只展示部分目录 部分展示目录 ##PPT下载 链接&#xff1a;https://pan.baidu.com/s/1ckvN9xeMR82hL30lHXfJ0g 提取码&#xff1a;ZYNB 点击下载&#xff0c;记得点个赞哦

ELK进阶-安全认证设置流程介绍

目录 一、前言 二、ElasticSearch的安全认证配置 设置ElasticSearch的安全认证功能&#xff08;最低&#xff09; 启用TLS/SSL加密通信 &#xff08;1&#xff09;生成CA证书 &#xff08;2&#xff09;生成transport证书 &#xff08;3&#xff09;生成http证书 &#…

docker镜像,ip,端口映射,持久化

docker 镜像的迁移&#xff1a;导出和导入镜像 查看镜像&#xff1a; [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB 打包 将镜像打包&#xff0c;找到save,可以将…

【非常困难】 猿人学web第一届 第10题 js 混淆 - 重放攻击对抗

文章目录 调试干扰第一个 debuggerHook 代码 第二个 debuggerHook 代码 第三个 Function.constructor.prototype 检测Hook 代码 完整的 Hook 代码 接口分析加密参数 m 生成位置加密参数还原加密点扣代码提示_yrxyA\$()var _yrxmEu _yrxWKg(_yrxyHJ...._yrxWKg() let result _…

半枚玄月照见人间空荡荡

半枚玄月照见人间空荡荡 昨夜玄月昨夜风&#xff0c;轻吹往事落心中。 众里寻他为何事&#xff1f;鸡鸣月落一场空。玄月 沙发上刷短视频笑得不经意抬头&#xff0c;忽而瞥见窗口防盗网挂着半枚月亮&#xff0c;玄黄色的&#xff0c;温润而冷冽&#xff0c;引人注目。 手机里…

国货之光|暴雨机推出面向大模型训练的AI服务器

当前&#xff0c;“百模大战”带来了算力需求的爆发&#xff0c;尤其是以ChatGPT为代表的多模态AI大模型&#xff0c;‌其参数规模和训练数据量均达到了前所未有的规模。‌GPT-3.5、‌GPT-4等模型的参数规模突破了万亿级别&#xff0c;‌训练数据量达到了TB级别&#xff0c;‌这…

zdppy+vue3+onlyoffice文档管理系统实战 20240823上课笔记 zdppy_cache框架的低代码实现

遗留问题 1、封装API2、有账号密码3、查询所有有效的具体数据&#xff0c;也就是缓存的所有字段 封装查询所有有效具体数据的方法 基本封装 def get_all(self, is_activeTrue, limit100000):"""遍历数据库中所有的key&#xff0c;默认查询所有没过期的:para…

51单片机——LED灯控制

1、LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯、屏幕 2、LED原理图 电阻在原理图上标注为1k&#xff0c;表示这是1千欧的电阻&#xff0c;实际在电路板上的表示是102 102解…

Godot《躲避小兵》实战之创建游戏主场景

游戏主场景 现在是时候将我们所做的一切整合到一个可玩的游戏场景中了。 创建新场景并添加一个 Node节点&#xff0c;命名为 Main。&#xff08;我们之所以使用 Node 而不是 Node2D&#xff0c;是因为这个节点会作为处理游戏逻辑的容器使用。本身是不需要 2D 功能的。&#x…

C\C++ Sqlite3使用详解

C\C++ Sqlite3使用详解 一、源码下载二、sqlite3接口说明C++2.1 项目创建以及sqlite3使用2.1 连接数据库2.2 sqlite创建表2.2.1 示例代码2.2.2 注意事项2.3 sqlite插入数据2.3.1 示例代码2.3.2 注意事项2.4 sqlite数据删除2.5 sqlite数据查询一、源码下载 下载地址: https://…

oneapi 获取通义千问模型密钥

1、打开 阿里云百炼大模型平台&#xff0c;点击开通&#xff0c;登录账号 2、获取密钥 3、查看模型名称&#xff0c;可以添加到 oneapi 的渠道中 别忘了添加向量模型