ARTICLE · 1136816
我给电脑装了多少软件?用 AI 盘了一遍,183 个
我给电脑装了多少软件?用 AI 盘了一遍,183 个
起因
起因挺蠢的。想装一个截图工具,折腾半天装完才发现,我早就装过一个功能差不多的。
这台电脑用了几年,软件是陆陆续续堆上去的。装的时候都记得,装完就忘。等到真要找一个东西的时候,要么翻开始菜单,要么干脆重装一遍。
还有第二个原因,更要紧:换设备。
我大概是两三年换一次主力机的节奏。每次换机最痛苦的不是搬数据,是重建环境。这个工具去哪下载?当时是哪个版本?那个配置项叫什么来着?全靠回忆,回忆不全,就得再用一段时间才能把习惯补回来。
所以我想,不如趁这个机会把软件清单盘一遍,留个底。
这件事不挑工具
我用的是 WorkBuddy,但说实话这件事对工具没要求。Claude Code、Cursor、Codex CLI,或者任何能读写本地文件、能执行命令的本地 Agent,都能做。
关键能力就两个:能读文件,能跑命令。剩下的都是它自己的事。
值得一提的是,跨平台也没问题。Windows 走注册表,macOS 可以扫 /Applications 加 brew list --formula,思路是一样的。
它是怎么一回事
这是我最想搞清楚的部分。整个过程拆开看是四步:

一、为什么从注册表入手
Windows 上想统计装了什么软件,能下手的地方有好几个:开始菜单、Program Files 目录、注册表。
前两个都不靠谱。开始菜单靠软件自己往里面放快捷方式,漏的漏、留的留;Program Files 目录更乱,卸载残留、共享组件、空文件夹全堆在里面,而且装到 D 盘、E 盘的软件根本不在这儿。
注册表是唯一一份系统自己维护的账本。 任何走正规安装流程的软件,都会在「卸载」信息里留一条记录。软件卸载时,这条记录会跟着删掉。也就是说它的准确性不依赖软件厂商有多上心,而是由安装器保证的。
读的位置是这几个键:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\UninstallHKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
二、三个键,分工不一样
这三个键不是重复的,各有各的管辖范围:
HKLM\...\Uninstall | ||
HKLM\WOW6432Node\...\Uninstall | ||
HKCU\...\Uninstall |
WOW6432Node 是 Windows 的 64 位系统重定向机制:64 位系统上跑 32 位程序时,注册表访问会被自动转发到这个节点,免得两边打架。所以它不是一个"额外的地方",是 32 位软件的唯一去处。
第三个别看它不起眼。像一些不需要管理员权限、直接装进用户目录的 AI 工具,只写在这里。我机器上就有一批。
顺带说一句,同一个软件可能同时出现在多个键里(比如先装过一次 32 位版又装了 64 位版),所以拿到结果之后要去重。我这台机器原始记录 330 条,去重后是 315 个不同的名字。
三、清洗不是靠猜,注册表自己标了
这一步是我觉得最有意思的地方。
330 条记录里,真正能算"用户装的软件"的,其实只有一半多。剩下的是运行库、SDK 组件、驱动。
一开始我以为得靠经验硬筛——写一堆规则,名字里带 “Visual C++” 的删掉、带 “Runtime” 的删掉、带 “Driver” 的删掉。这么干当然能work,但很脏,也容易误杀。
后来发现根本不用。注册表里本来就有字段在标注这件事。
每个卸载项除了名字和版本,还带着一些元数据字段:
DisplayName | |
DisplayVersion | |
Publisher | |
InstallLocation | |
SystemComponent | 值为 1 时,表示这是系统组件,不该展示给用户看 |
ReleaseType | |
ParentKeyName |
也就是说,微软在设计这套机制的时候就预见到了这个问题,专门留了 SystemComponent 这个标记位,让那些不该出现在"卸载程序"列表里的东西自己声明身份。
我回查了一下我这台机器的真实数据:
原始记录 330 条SystemComponent=1 149 条剩下 181 条
149 条,占了将近一半。 而且分布非常集中:
光这三家就 89 条,占了系统组件的一大半。这些条目如果留在表里,清单会直接变成一堆没人看得懂的英文类库名。
按 SystemComponent 剔除之后剩 181 条,再叠加从便携目录扫出来的绿色软件、去掉重复,最后得到 183 条——量级正好对得上。
这里还有个副产品:InstallLocation 字段其实有 229 条是空的,也就是说大部分软件根本不记录自己装在哪。所以如果你想靠这个字段去遍历目录,是走不通的。
四、注册表管不到的地方
上面这套方法有个明确的盲区:绿色版、便携版软件不写注册表。
它们不解压安装、不注册卸载项,理论上系统完全不知道它们存在。我机器上这类还不少,比如放在自建目录里的 qBittorrent、VeraCrypt、KeePass。
所以还得补一轮目录遍历。但这一步不能瞎扫——扫整个 C 盘又慢又吵,还会把缓存目录当成软件。做法是限定在几个已知的软件目录里逐层列:
E:\04software\tools ← 各类工具E:\04software\ai ← AI 工具E:\04software\code_tools ← 开发工具D:\software\工具D:\software\科研
第一层看目录名,认不出来的再往下钻一层看内容。靠这个又捞回来十几个不在注册表里的软件。
五、最难的不是采集,是判断
前面几步都是机械操作,真正费劲的是最后这步。
「作用」和「是否开源」这两列,不是采集出来的,是判断出来的。
作用好办,靠软件名、厂商、安装路径来认,基本不会错。是否开源就得靠知识了,而知识会出错。
我注意到它在处理这件事上的态度挺克制:对拿不准的那几个(NexQ、Metrik、stack-board 这类冷门工具),它没有硬猜,而是钻进安装目录去找 README、使用说明、LICENSE 文件。找到证据就下结论,找不到就标「待核实」。
最后表里 19 条是「待核实」。我觉得这比填 19 个可能是错的答案要好。
它另外还加了一个「部分开源」的状态,用来处理 JetBrains 这种 Community 版开源、Ultimate 版闭源的双发行版情况。不加这个状态的话,IDEA 和 PyCharm 只能二选一,怎么填都是错的。
六、一份数据,两种渲染
最后一步没什么技术含量,但设计上值得一提。
整理好的数据只有一份(一个结构化的列表),网页和 Excel 是从同一份数据渲染出来的两个视图:
网页:数据内嵌成 JSON,前端做搜索和筛选,不需要后端 Excel:用 openpyxl 写出三个工作表,带自动筛选和冻结表头
这样做的好处是数据只维护一处。以后装了新软件想更新清单,改数据重跑脚本就行,两个文件同时更新,不会出现网页和表格数字对不上的情况。
结果
最后拿到两个文件。这是网页版的样子:

顶部是统计卡片和搜索框,下面是分类标签。点标签能直接切到某一类,比如「开发与编程」:

顺便能看出「部分开源」这个状态的实际效果——IntelliJ IDEA 和 PyCharm 都标着琥珀色的「部分」,备注里写明 Community 版和 Professional 版的区别。
再往下是附录,专门放那些被剔除的系统组件:

附录里也能看到清洗的痕迹,比如 NVIDIA 那二十多条被合并成了一行。
最终统计:用户软件 183 项,其中开源 67 项、闭源 91 项、部分开源 6 项、待核实 19 项。
顺手还看出点东西。比如我机器上 JDK 装了 21、17、11 三个版本并存,Maven 也是两个版本,这种「历史遗留」的重复安装,不盘一遍是真不知道。
踩到的一个坑
顺手记一个技术细节。
这台机器上命令行工具的输出不回显。命令明明跑成功了(退出码是 0),但拿不到结果。所以它改成先把结果写进一个临时文件,再读文件取内容。
这是个环境问题,不是工具问题,但不注意的话,会以为扫描失败了。
复现提示词
下面这段可以直接复制到任何本地 AI 助手用。它会扫描你电脑上的软件,生成一个网页和一个表格文件。
帮我扫描这台电脑上已安装的所有软件,整理成一份清单。【数据来源要全】1. Windows:读取注册表三个卸载键,缺一不可HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\UninstallHKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallmacOS:扫描 /Applications、~/Applications,以及 Homebrew(brew list --formula)2. 再遍历一遍常见的便携/绿色软件目录(比如 D:\software、E:\software 这类自建目录),把不写注册表的绿色版也捞出来。不要扫整个系统盘。【清洗要按注册表字段来,不要靠猜】优先用 SystemComponent = 1 剔除系统组件,这个字段就是干这个的。VC++ 运行库、.NET 运行时、Windows SDK、显卡/主板/网卡驱动这类,单独放一份「系统组件与驱动」附录,不要混进主表。同一个软件装了多个版本的,合并成一条,版本号写在一起。【每条软件要有这四列】- 软件名称- 版本- 作用:一句话说清它是干什么的- 是否开源:只能填「是 / 否 / 部分 / 待核实」四种之一(「部分」用于 Community 版开源、商业版闭源这种情况,比如 JetBrains 系)【分类】按用途分类,比如:开发与编程 / AI 与大模型 / 效率与系统工具 / 文档笔记与办公 /通讯与协作 / 同步备份与网盘 / 安全与加密 / 阅读与科研 / 下载与网络 / 媒体与影音 /游戏与娱乐 / 金融理财 等,按我的实际情况调整。【准确性要求】不确定用途或开源状态的软件,标注「待核实」,绝对不要编造。遇到判断不了的,打开它的安装目录找 README、使用说明、LICENSE 文件,从里面找证据再下结论。【交付两个文件,都放到当前工作目录的 outputs/ 文件夹里】1. 一个 HTML 页面:带搜索框和分类筛选标签,可以按分类切换、按关键词实时搜索,浅色主题、简洁风格。要有统计卡片显示总数和开源/闭源分布。筛选和搜索要纯前端实现,数据内嵌,不要依赖本地服务器。2. 一个表格文件(.xlsx):包含上面所有列,带自动筛选和冻结表头。系统组件单独一个工作表,再加一个统计概览工作表。做完告诉我:一共扫到多少条原始记录、清洗掉多少、开源比例是多少、有哪些标了「待核实」。
就这样。如果你也装了太多软件记不住,或者正准备换电脑,花几分钟跑一遍,能省下不少以后的麻烦。