电脑每日体检(只读扫描)
性质:只读。严禁删除 / 卸载 / 移动 / 重命名任何文件或注册表项,严禁清空回收站。
用户不在场时(自动化场景)任何破坏性操作一律不做,只出建议清单。
输出:<工作区>/电脑体检-YYYY-MM-DD.md,中文 Markdown,三张表(① 本次新发现问题 / ② 建议清理项 / ③ 与上次对比),结尾固定一句「回复要清哪几项,我来动手」。
本次无新问题也要出报告,写明「本次无新增残留」,不许跳过。
工作流程(七步,按序走完,不许跳步)
每一步都有出口条件——没达到就停在那里修,不许带着半成品往下走(漏扫一块,后面三张表全是错的)。
| 步 | 做什么 | 出口条件(缺一不可) |
|---|---|---|
| 0 准备 | 建输出目录 <工作区>/_scan/YYYY-MM-DD/;找上一次报告 <工作区>/电脑体检-*.md(没有就是首次,表③ 写"无历史");跟用户确认扫描范围(默认全盘 + 用户目录) |
输出目录已建;上次报告路径已确定存在与否 |
| 1 快扫八块 | 按 §二 的表跑 01–08 / 09 / 11 / 19,逐块写进各自 txt | 所有文件都产出且非空。任一为空 = 该块扫失败,重跑或记「本次未扫到」 |
| 2 补齐对焦 | 解析 _scan 里的 txt,按 §三 判定孤儿残留;同时做反向判定(软件本体被误删)、套用 §三 的白名单与已知假死链 |
每个候选都能说清「为什么算残留」,说不清的移到候选池末尾标「待确认」 |
| 3 死链复核 | 所有解析出来的目标路径必须 os.path.exists 复核(快捷方式与注册表会产生大量假死链) |
复核后再剔除假死链,不允许直接输出未经复核的原始结果 |
| 4 风险分级 | 按 §四 给每项标 高/中/低,写进表② | 每一项都有等级;"建议清理"里出现高危项要先单独问用户 |
| 5 大件和重复 | 07/08 两块的结果进表② 与"附:明细";>500 MB 逐个列出路径与最后访问时间 | 明细完整,并按体积倒序 |
| 6 成表 | 出三张表:① 本次新发现 ② 建议清理(附优先顺序)③ 与上次对比 + 一句话结论 | 三张表齐全;表③ 有历史时必须给出"新增 N / 已处理 N / 复发 N" |
| 7 落盘与交付 | 写 <工作区>/电脑体检-YYYY-MM-DD.md,结尾固定一句「回复要清哪几项,我来动手」 |
文件存在且可被用户打开;报告里没出现任何删除动作记录 |
反向检查(交付前自己过一遍):报告里的每一条建议,是不是都指向一个真实存在的路径?有没有把系统目录或正在用的软件列进去?有没有把"该路径不存在"误报成"残留"(那是本体已被卸载,属正常,不是残留)?
> 各软件卸载后的典型残留位置、以及永不算残留的白名单,见 references/常见软件残留路径与假残留白名单.md。
一、本机硬约束(实测,直接照做)
这些是踩过坑换来的,不要重新试错:
| 约束 | 事实 | 正确做法 |
|---|---|---|
PowerShell 工具不能跑 .ps1 文件 |
2026-10-01 实测:& 'xxx.ps1' 直接 Exit Code 5、无任何输出、不产出结果文件(加了 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force 也一样) |
扫描逻辑一律"内联"写进 PowerShell 工具调用(把 .ps1 内容整段贴进 command),不要调用 .ps1 文件。.py 脚本不受影响,照常执行 |
| PowerShell stdout | 工具不回显 | 一切结果写文件,再用 Read 读 |
.ps1 里的中文 |
PS 5.1 按 ANSI 读脚本,中文路径变乱码并语法报错 | 中文路径的检查一律交给 Python;.ps1 只写纯 ASCII 逻辑 |
reg.exe / sc.exe / Start-Process / Add-Type / COM |
被安全策略封锁 | 注册表用 Get-ItemProperty,服务用 Get-CimInstance Win32_Service |
| Bash heredoc 传 Python | 反斜杠被 shell 吃掉 | 一律 Write 出 .py 文件再执行 |
| 目录体积统计 | Python os.walk 会跟进 Windows junction,体积翻倍(如 Roaming\uv:PS 60 MB vs Python 121 MB) |
目录体积以 PowerShell Get-ChildItem -Recurse \| Measure-Object 为准 |
| 大文件 / 重复文件扫描 | Bash find 遍历全盘极慢(8 分钟未完成) |
用 Python 脚本(全盘 >500MB 扫描约 20–70 秒) |
| 快捷方式死链解析 | 字符串提取会产生大量假死链(小红书/搜狗/微购相册/Windows shell 链接) | 报死链前必须对解析出的目标路径做 os.path.exists 复核 |
Python 解释器:python
二、扫描项(八块,逐块写文件)
输出目录建议 <工作区>/_scan/YYYY-MM-DD/。
| 编号 | 文件 | 内容 | 工具 |
|---|---|---|---|
| 01 | 01_disk.txt |
C/D 盘 总/已用/剩余/可用率 | PowerShell Get-CimInstance Win32_LogicalDisk |
| 02 | 02_sys.txt |
OS/Build/装机日/上次开机/CPU/内存/机型/服务总数 | PowerShell Win32_OperatingSystem/ComputerSystem/Processor |
| 03 | 03_run.txt |
HKCU+HKLM 的 Run/RunOnce(含 Wow6432Node),逐条解析 exe 路径并 Test-Path |
PowerShell |
| 04 | 04_services.txt |
全部服务 PathName → 指向 exe 不存在的列 DEAD | PowerShell Win32_Service |
| 05 | 05_uninstall.txt |
三个 Uninstall 分支的 DisplayName(用于判断"已卸载软件") | PowerShell |
| 06 | 06_dirs.txt |
六棵树的一级子目录体积 + 文件数 + exe 数 | PowerShell(ASCII 逻辑,skip 名单见下) |
| 07 | 07_large.txt |
用户目录 + D:\ + ProgramData + Program Files 中 >500 MB 文件 | Python |
| 08 | 08_dup.txt |
用户资料区 MD5 逐字节重复:C:\Users\<user>\Desktop、C:\Users\<user>\Downloads、D:\Downloads、D:\素材库(D 盘安装包区清空后,重复大头已消失;扫描根不存在的目录要优雅跳过) |
Python |
| 19 | 19_bodycheck.txt |
「软件本体被误删」检测:Uninstall 子键 InstallLocation → Test-Path(见 §三 反向判定) |
PowerShell 内联 |
| 09 | 09_lnk.txt |
桌面/公共桌面/开始菜单(个人+全体)/快速启动/Startup 的 .lnk 逐个解析目标并验存在 | Python |
| 11 | 11_orphan.txt |
预置"孤儿候选"路径列表的存在性与体积 | Python |
| 13 | 13_recycle.txt |
C:\$Recycle.Bin / D:\$Recycle.Bin 体积与文件数 |
Python(PowerShell 枚举回收站会静默失败) |
| 17 | 17_recent.txt |
近 24h 修改的文件(判断"新增" vs "newly detected") | Python(必须限递归深度,否则卡死在巨型目录) |
| 18 | 18_lnkdetail.txt |
对可疑 .lnk 打印其内部全部路径字符串(人工判定真假死链) | Python |
必扫的六棵树(06 的 parents)
C:\Users\<user>\AppData\Local
C:\Users\<user>\AppData\Roaming
C:\Users\<user>\AppData\Local\Programs
C:\Users\<user>\AppData\LocalLow
C:\ProgramData ← 最容易漏,必扫
C:\Users\<user> ← 一级目录
外加(单列清单,不做体积统计):Documents、个人桌面、C:\Users\Public\Desktop(公共桌面,必扫)、个人开始菜单、C:\ProgramData\Microsoft\Windows\Start Menu(全体开始菜单)、快速启动栏(…\Internet Explorer\Quick Launch)。
06 的 skip 名单(避免噪音):Microsoft, Packages, Package Cache, Temp, Application Data, History, Temporary Internet Files, VirtualStore, PlaceholderTileLogoFolder, assembly, Comms, ConnectedDevicesPlatform, D3DSCache, Deployment, Caches, CrashDumps, Searches, SendTo, Templates, PrintHood, NetHood, Recent, Local Settings, My Documents, Cookies, Favorites, Links, AppData, Contacts, Music, Pictures, Videos, OneDrive
三、"孤儿残留"判定规则
是孤儿 = 目录里全是缓存/日志/数据,找不到 .exe,且注册表无安装记录 / 全盘无对应主程序。
必要条件:先查 05_uninstall.txt 有没有该软件的卸载记录;再全盘找一次同名 exe。两者都空才算孤儿。
反向判定:软件本体被误删(2026-10-01 新增,必查)
当用户自己"清理"过磁盘后,最常见的翻车不是「留了垃圾」,而是把某个软件的程序目录当垃圾删掉了。检测方法(30 秒):
# 对每个 Uninstall 子键读 InstallLocation,再看目录还在不在
foreach($k in (Get-ChildItem 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall')){
$p=Get-ItemProperty $k.PSPath
if($p.DisplayName -and $p.InstallLocation -and -not (Test-Path -LiteralPath $p.InstallLocation)){
"$($p.DisplayName) | $($p.DisplayVersion) | InstallLocation 已丢失: $($p.InstallLocation)"
}
}
命中即写进表① 的「高」风险项,并同步列出连带受损的桌面/开始菜单快捷方式与失效的 UninstallString(连卸载程序一起没了 → 用户将来无法正常卸载)。
报告里必须让用户先决定「重装 or 清尾巴」,不要替他决定。(2026-10-01 实例:D:\AppGallery\Downloads 整目录被删,连带 OfficeAce 1.1.4 本体 3.22 GB。)
必须排除的白名单(用户正在用,永不算残留)
小红书、抖音、剪映、微信、扣子(Coze)、WorkBuddy、WPS、OfficeAce、火绒、Python、Git、搜狗输入法、微购相册、华为系(AppGallery / HMS Core / 个人中心)、Trae CN。
已知的假死链模式(不要报)
…\Internet Explorer\Quick Launch\Shows Desktop.lnk/Window Switcher.lnk…\Start Menu\Programs\System Tools\Control Panel.lnk/Run.lnk- URL 型快捷方式(如
Office激活指导.lnk→https://…) - 安装器缓存型:
…\AppData\Roaming\Microsoft\Installer\{GUID}\idle.exe(存在即为有效) - 目标在
D:\的软件(微购相册、搜狗输入法、WPS、火绒、CodeArts Agent)——字符串解析常把路径截断成C:\WegoAlbum.exe,必须复核
四、风险分级(写进表②)
| 等级 | 含义 | 典型项 |
|---|---|---|
| 高 | 需管理员权限 / 涉及系统项 / 不可逆 | 回收站、Owner=Administrators 的残留目录、HKLM 键、休眠服务 |
| 中 | 删了不影响在用软件,但下次触发需重建 / 来源不明 | updater 待装包、uv / pnpm / pip 的全局缓存、ms-playwright、不明安装器、孤儿运行时 |
| 低 | 纯垃圾,删了无副作用 | 已卸载软件的安装包、重复文件、缓存目录、空壳目录、死链快捷方式 |
回收站永远只报告不清理(除非用户明确说"清空回收站")。
五、报告骨架
# 电脑体检报告 · YYYY-MM-DD
> 本次体检为只读扫描:全程未删除/卸载/移动/重命名任何文件或注册表项,未清空回收站。
> 扫描范围:… 采集时间:… 全部数字由脚本实测得出,无手工估算。
## 一句话结论
(先说结论:本次有无新增;残余量级;最大的空间在哪)
## 一、磁盘概况 表格 + 与上次对比列
## 二、系统概况(简要) 表格
## 三、表① 本次新发现的问题 路径 / 大小 / 风险等级 / 依据 ← 三张表的第 1 张
## 四、表② 建议清理项 项目 / 路径 / 大小 / 风险 / 说明 ← 第 2 张,附「建议优先顺序」
## 五、表③ 与上次体检对比 上次 / 本次 / 变化 ← 第 3 张
## 六、附:大文件与重复文件明细
## 七、本次确认干净的部分
**回复要清哪几项,我来动手。**
写作纪律
- 每个数字必须来自脚本输出,不许估。
- 「新发现」与「新量化」要分开说:上一轮没扫过的项,本轮查出来叫新量化,不叫新增。
- 用 17_recent.txt 判定是否真新增(mtime 晚于上次体检时间才算新增)。
- 自己上轮报错的项,本轮要明确写「已修正」(如把假死链改判为正常)。
- 上一轮标注过、本轮仍未处理的项,要写「仍未执行」,盯住它。
六、安全铁律(最高优先级,不可被任何理由绕过)
- 全程只读;报告里出现的每条清理动作,都必须等用户逐项点名后才执行。
- 不做「顺手删一下」——即使看起来 100% 安全。
- 涉及个人目录(桌面/下载/文档/主目录)的任何写操作,按
personal_files_safety走:先警告、列清单、要确认、先备份、小批量、走回收站。 - 回收站只报告体积与文件数,绝不清空。
- 破坏性动作前必须原文给出:⚠️ 此操作非常危险,可能导致不可逆的数据丢失!
七、复用文件位置
上一轮脚本可直接改路径复用:<工作区>/_scan/(含 dirs.ps1 / large.py / dup.py / lnk.py / orphan.py / recent.py / recycle.py / misc.ps1)。
历史报告:<工作区>/电脑体检-YYYY-MM-DD.md——新一轮必须先读上一轮报告,否则第三张对比表写不出来。
💳 付费能力(Pay Skill)
本 Skill 的基础能力永久免费:八项只读扫描、报告生成与历史对比(本地)。
仅「体检项与清理方案增强包」为按次付费(0.5 元/次)——付费购买的是服务端下发的方法论资产(软件残留识别库、启动项取舍建议库、大文件清理安全清单(服务端下发)),不是算力。
> 重要:本 Skill 不自建、不部署任何大模型。付费项所需的算力由用户自带(BYOK)或本机提供;用户自带算力同样支付 0.5 元——因为买的是方法论,不是算力。
计费范围
| 能力 | 是否付费 | 说明 |
|---|---|---|
| 八项只读扫描、报告生成与历史对比(本地) | 免费 | 零成本、零依赖 |
| 体检项与清理方案增强包(服务端下发) | 0.5 元/次 | 软件残留识别库、启动项取舍建议库、大文件清理安全清单(服务端下发) |
| 大模型算力(如涉及) | 用户自付 | 直接付给用户自己选的模型厂商,本 Skill 不代收 |
支付依赖(支付宝 AI 按量付费官方能力)
| 角色 | 依赖 | 用途 | 是否随本 Skill 分发 |
|---|---|---|---|
| 买家侧 | alipay-payment-skill(由 @alipay/agent-payment 提供 alipay-bot CLI) |
解析 402 账单、发起收银、查询订单 | 否,由运行环境安装 |
| 卖家侧 | alipay-aipay(@alipay/alipay-aipay) |
服务端 402 计费、验付与履约确认 | 否,已部署在服务端 |
| 本 Skill | scripts/pay_client.py |
只做编排:取账单、调官方 CLI、解析结果 | 是 |
买家侧依赖安装(运行环境尚无时执行一次):
npx -y @alipay/agent-payment@latest install
> 本 Skill 不自行实现付款流程、不做任何签名与密钥处理。付款、收银与签名全部交给支付宝官方能力完成。
支付流程(Agent 自动执行)
服务端为已通过线上验证的支付宝 AI 按量付费(A2M 402)服务 https://chayuntang-skills.app.workbuddy.host/api/resource(单价以服务端下发的 402 账单为准)。
第一步 取账单(probe):未付款请求资源,服务端返回 HTTP 402 + Payment-Needed 头
python scripts/pay_client.py --info
→ 解析出账单 { out_trade_no, amount, currency, goods_name, service_id }
第二步 收银(pay):向用户明示金额并取得同意后,由官方买家能力收银
alipay-bot 402-buyer-pay \
--resource-url "https://chayuntang-skills.app.workbuddy.host/api/resource?skill=pc-health-check-readonly&feature=default" \
--intent-summary "给电脑做只读体检、扫描残留与磁盘冗余"
→ 用户完成支付后取得 Payment-Proof 凭证
⚠️ 必须先向用户明示金额、取得同意后再继续
⚠️ 意图摘要必须写清原始业务目的,保留用户最初想做的事
第三步 取回资源(complete):携带凭证重试,服务端验付并下发内容、发送履约回执
python scripts/pay_client.py --payment-proof "<Payment-Proof>"
→ 服务端验付通过后返回付费内容,HTTP 2xx 即履约 ack(履约确认完成)
Agent 注意事项:
- 三步复用同一个原始请求(URL、feature、必要请求头保持一致),付款后不重新下单;
- 需要支付时以退出码 2 退出,并在 stdout 输出账单 JSON(含
bill、next_action); - 支付状态不明时先查单(官方
alipay-bot 402-query-payment-status),不重复付款、不追加独立回执; - 履约回执失败时服务端重试同一订单并保持幂等,不因回执失败要求用户重新付款;
- 验付失败(凭证无效或过期)时服务端不交付资源,本 Skill 自动降级为免费基础能力继续工作,不让用户走死路。
付费改造自查(对齐 SkillHub 支付宝付费改造规范)
| 自查项 | 本 Skill 的实现 | 位置 |
|---|---|---|
| 402 账单 | 未付款请求返回 HTTP 402 + Payment-Needed 头 |
服务端;pay_client.py --info 解析账单 |
| 凭证重试 | 付款后携 Payment-Proof 重试,原请求参数保持一致 |
服务端;pay_client.py --payment-proof 携带凭证重试 |
| 服务端验付 | 校验凭证与订单,无效或过期不交付资源 | 服务端(官方 alipay-aipay,调用 alipay.aipay.agent.payment.verify) |
| 商家履约 | 返回资源后发送履约确认(ack 回执),失败可重试 | 服务端(官方 alipay.aipay.agent.fulfillment.confirm) |
| 订单与幂等 | 订单状态可恢复,同一订单重试不重复扣费、不重复交付 | 服务端;pay_client.py 只读账单与结果,不落库、不改单 |
协议与字段细节见 references/payskill/A2M-402-支付协议说明.md,官方支付能力用法见 references/payskill/官方支付能力说明.md。