【做什么】纯 Windows 只读存储分析 — 扫描 12+ 组目标(含 Installer/ProgramData/回收站)→ 三灯分级(🟢可自动清/🟡需判断/🔴建议卸载)→ 交互式 HTML 报告 + 本地服务一键删。 【何时用】用户抱怨磁盘空间不足、要求清理/分析/查看空间占用、想知道什么东西吃硬盘。 【触发词】磁盘满了/C盘满了/D盘满了/空间不够/清理空间/清理磁盘/清理C盘/占空间/ 存储分析/磁盘分析/看一下存储/电脑空间/storage analysis/disk cleanup/清缓存/
存储分析器 Windows QQ Windows , äHTML + + + + 1-2.scan.py + 12 + , + TEMP% storage sc
功能概述
存储分析器 Windows QQ Windows , äHTML + + + + 1-2.scan.py + 12 + , + TEMP% storage sc是一项面向实际任务的技能,主要用于Storp 3.;Agent (v) + jSONXIMP% storage analysis.json.Stet 4.se.。
核心要点
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
- 从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。
使用与执行
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
结果检查与注意事项
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
Storage Analyzer Windows
纯 Windows 只读存储分析,交互式 HTML 报告 + 一键清理。
| 阶段 | 谁执行 | 做什么 | 产出 |
|---|---|---|---|
| Step 1-2 | scan.py 脚本 |
只读扫描 12 组目标,算大小 | %TEMP%storage_scan.json |
| Step 3 | Agent (你) | 读参考→探查→三灯分级→写 JSON | %TEMP%storage_analysis.json |
| Step 4 | server.py 脚本 |
启动本地服务 → 交互式网页 | http://127.0.0.1:端口/ |
| Step 5 | Agent (你) | 用 preview_url 打开 + 对话给摘要 | 浏览器预览 + 文字结论 |
速览:用户说"磁盘满了" → 跑
scan.py --quick(0.3s) 看概况 → 需要详情再跑全量(9s) → 按附录A模板写分析JSON →server.py启动交互式服务 → 自动用 preview_url 打开 → 给用户一句话摘要。全程只读扫描,交互式网页支持一键清理。
约束规则
铁律
- 全程只读扫描。 只能跑
os.scandir/shutil.disk_usage/ 列目录。 - 删除命令只展示,不执行。 报告里的清理命令供用户在终端确认后运行。 即使用户在对话里说"帮我删",也要先停下确认,不要直接代跑。
- 系统目录保护。
C:Windows除了 Installer / Temp / SoftwareDistribution 之外不扫描不操作。 - 回收站警告。 清空回收站前必须明确告知空间释放量。
- 长路径处理。 Windows 路径 >260 字符时使用
\?前缀。
⏸️ 确认门
Step 3 完成后,必须暂停,向用户展示:
- Top 5 摘要(表格:排名/名称/大小/分级/一句话说明)
- 三灯汇总(🟢 X 项约 Y GB / 🟡 X 项约 Y GB / 🔴 X 项约 Y GB)
- 问用户:"分级结果如上,是否继续生成报告?还是需要调整?"
用户同意后才进入 Step 4。 如果用户要求调整,只调用户指定的项,不要推翻全部分级。
异常处理
| 异常场景 | 处理方式 |
|---|---|
| Python 未安装 | 提示用户安装 Python 3.10+:winget install python3 或从 python.org 下载。不要用 python3 命令,Windows 上是 python 或 py -3。 |
| scan.py 输出为空 | 检查 %TEMP%storage_scan.json 是否存在且非空。为空则重新扫描并加 2>&1 捕获 stderr 排查错误。 |
| 扫描结果全 0(空盘) | 报告直接给摘要"磁盘基本为空,无需清理"。不跑 Step 3 分析。 |
| 某个 target 目录不存在 | 跳过,不给 denied。如 C:WindowsInstaller 在某些精简版 Windows 上不存在。 |
| server.py 端口被占用 | server.py 使用端口 0(随机),不会冲突。如遇异常,检查防火墙/杀毒软件是否拦截 127.0.0.1 本地回环。仅在用户要求服务模式时使用。 |
| build_report.py 写入桌面失败 | 检查桌面路径是否可写,如被 OneDrive 同步占用则改写到 %USERPROFILE% 或 %TEMP%。 |
| 浏览器打不开 | 手动复制终端输出的 URL 到浏览器。或用 --no-browser 参数跳过自动打开。 |
| recycle_bin 扫描为空 | 原因:普通用户无权读 C:$Recycle.Bin。给提示:"回收站大小无法直接读取,请右键桌面回收站查看属性"。 |
| 磁盘接近满(<1GB 可用) | 优先使用 --quick 模式避免扫描写出大量 JSON 占用最后空间。写 analysis JSON 时确认 %TEMP% 有足够空间。 |
| 权限拒绝(denied) | 扫描结果中 denied 标注的目录,在报告中列出并说明"可能遗漏体量"。不要尝试 runas 提权。 |
执行流程
Step 1 快速扫描(可选,0.5s 内)
python scripts/scan.py --quick > %TEMP%storage_scan.json
仅扫描一级子目录大小(跳过递归),大文件自动聚合显示。 适用场景:快速判断"有没有大问题"。
Step 2 全量扫描
python scripts/scan.py > %TEMP%storage_scan.json
扫描 12 组目标(详见 references/windows.md),耗时约 9-15s(SSD)。
读不到的目录标 denied。
Step 3 分析与分级
先读 references/windows.md 了解布局规则,再读扫描 JSON。
按 附录A 的 6 条检查清单逐条执行,按 附录B 的模板写出 analysis JSON。
核心决策规则(详见附录A):
- 🟢 可自动清理 — 纯缓存/临时文件/可再生,正例:
pip Cache,反例:node_modules - 🟡 需人工判断 — 含用户数据或需判断成本,正例:
WeChat Files,反例:WindowsSystem32 - 🔴 建议卸载 — 大应用/重复安装,正例:不再用的
MobileAppEngine,反例:C:Windows - 其他 → 不展示(归蓝色)
Step 4 启动交互式服务并自动打开
使用 PowerShell Start-Process 以独立进程启动(不受 Bash 超时影响):
Start-Process -FilePath "python" -ArgumentList "scripts/server.py","%TEMP%storage_analysis.json","--no-browser","--port-file","%TEMP%storage_server_url.txt" -WindowStyle Hidden
启动后:
- 等待 2 秒读取
%TEMP%storage_server_url.txt获取 URL - 健康检查
GET /health确认服务正常 - 用
Start-Process在用户默认浏览器中打开 URL(不要用preview_url,内嵌浏览器无法正确执行交互式功能) - 同时可用
preview_url在内嵌面板中预览(仅查看,一键清理功能需在真实浏览器中使用)
这是默认模式,交互式网页支持:
- 🟢 一键清理全部 — 确认面板 + 逐项串行删除 + 进度反馈
- 🟢 单项移到废纸篓 / 直接删除
- 🟡 在资源管理器打开 / 安全子路径移废纸篓
- 🔴 在资源管理器打开(去卸载)
- 折叠卡片、锚点导航、命令复制
可选:静态报告模式(仅查看,不能操作删除):
python scripts/build_report.py %TEMP%storage_analysis.json %USERPROFILE%Desktopstorage-report.html
纯静态只读 HTML 文件,不含删除功能。仅在用户明确要求静态报告时使用。
Step 5 摘要总结
报告打开后,给一段结论先行的摘要:总可释放估算、最该先清的 2-3 项、风险最高的一项。细节让用户看网页。
附录A:分析检查清单
逐条执行,每完成一条在脑中打勾。
1. 挑 Top 5:按 size_kb 排序全部 groups 条目,取前 5,判定类型标签。 标签按优先级从高到低匹配,命中即停止,后面的不再考虑:
优先级 标签 释义 判定依据 1 系统文件 操作系统运行依赖的核心文件与组件仓库,误删可能导致系统不稳定、功能异常或无法启动 C:Windows下除 Temp/SoftwareDistribution 外的全部子目录,C:Boot, EFI 分区,pagefile.sys,hiberfil.sys2 应用程序文件 应用程序安装目录下的全部文件(含 exe/dll/资源/配置),删除将导致对应应用无法运行 C:Program Files*,C:Program Files (x86)*,%LOCALAPPDATA%Programs*下的应用目录3 虚拟机镜像 虚拟机/模拟器的磁盘镜像文件,删除将导致虚拟机数据完全丢失且不可恢复 EmulatorSdk 镜像, WSL vhdx, Hyper-V 虚拟硬盘, VMware .vmdk, VirtualBox .vdi 4 应用数据 应用产生的不可再生或具有持久价值的用户个人数据,通常位于 AppData 及其子目录 WPS 模板,微信聊天记录,钉钉消息,邮箱本地数据5 应用缓存 面向最终用户的应用产生的可再生临时文件,删除不影响功能、不丢用户数据 浏览器 Cache,缩略图缓存,微信/QQ 图片缓存,%TEMP%*, Office 最近文件索引6 开发缓存 包管理器/构建工具/IDE 产生的可再生中间文件,删除后可通过重新下载或构建恢复 pip Cache,.npm,.gradle,.m2/repository,Cargo target/,Yarn cache,NuGet packages7 用户文件 用户主动创建/编辑/保存的个人文档、工程文件、自建图片等 Desktop,Documents,Pictures,WorkBuddy*项目目录8 媒体内容 从网络下载或应用缓存的消费型音视频文件,常见于 Downloads/Videos/Music 及各 App 离线目录 Downloads里的.mp4/.mkv/.avi, App 离线视频缓存,Music9 下载内容 Downloads 目录下用户通过浏览器/下载器获取后未整理的文件(安装包、压缩包、文档等) Downloads*.exe,Downloads*.msi,Downloads*.zip10 回收站 Windows 回收站内容 C:$Recycle.Bin, 各盘符$Recycle.Bin11 其他 以上均不匹配的兜底分类 — 互斥规则:按优先级 1→11 依次匹配,命中即停。例如:
Downloads下的安装包优先匹配 9(下载内容),而非 8(媒体内容);%TEMP%下的编译中间文件优先匹配 6(开发缓存),而非 5(应用缓存)。2. 探查神秘大目录:对名称含 UUID/GUID/SSID 的目录、大小 >1GB 的 ProgramData 子目录、不明用途的隐藏目录 →
ls查看内部结构,查出归属。 例:kingsoft/wps_international/addons实为国际版 WPS 的冗余插件。3. 三灯分类(只分"存在清理决策"的项,正常应用/系统文件归蓝色不展示):
🟢 可自动清理 — 纯缓存/临时文件/安装包残留/可再生不丢用户数据
- ✅ 正例:
浏览器 Cache、%TEMP%*、--updater 目录、pip Cache(开发缓存可再生)、IntelliJ IDEA caches - ❌ 反例:
node_modules(项目依赖,删了项目跑不了)、AppDataRoamingMicrosoft(Office 设置不可再生)、微信聊天记录(用户数据) - 必填
trash_paths[]、commands[{label,cmd}]、kill_processes[]。 - ⚠️
trash_paths不能为空,漏了按钮就不出现。
🟡 需人工判断 — 含用户数据或有判断成本
- ✅ 正例:
WeChat Files(聊天记录含重要数据)、Downloads文件夹(可能有重要文件未整理)、WPS 模板(含自定义)、VMware 虚拟机镜像(大小巨大但可能还在用) - ❌ 反例:
C:WindowsInstaller不能手删(用 DISM 清理)、C:WindowsWinSxS不能手删(系统组件仓库)、C:WindowsSystem32不能手删 - 必填
content_profile、why_manual、disposal、risk。 - 有核实过的安全子路径时 →
trash_paths(🟡 只能移废纸篓,永不给 rm)。 - 目录是 App 内部格式 →
open_note字段说明。 - ⚠️ 口吻中性如产品说明,不写"我发现/提醒注意"。
🔴 建议卸载(别手删) — 大应用/重复安装/想卸载的项
- ✅ 正例:不再用的
MobileAppEngine(7.6GB)、EdrawSoft(1.2GB)、Autodesk(2GB+) - ❌ 反例:
C:Windows(操作系统本身)、Microsoft Office(如果还在用)、dotnet(系统运行时依赖)、Git(开发必备工具) - 必填
why_keep、indirect_release(具体卸载步骤,可照做不是空话)、app_paths[]。 - 不给删除按钮,只给"在资源管理器打开(去卸载)"。
- ✅ 正例:
4. 数量检查:green+yellow+red 的总信息量应「一眼能看完」。 如果某级超过 10 项,挑最重要的列,其余合并到 summary。
5. 大小字段规范:用"约 14 GB""合计约 8.6 GB"格式。 "约"已表示估算,不要再加"(估算)"。
6. 按附录B模板写出完整 analysis JSON。
tier_stats的 green/yellow/red 必须是可解析的 GB 数字开头(如"约 27.8 GB")。
附录B:analysis JSON 模板(照此结构写)
{
"generated_at": "2026-06-03 17:00:00",
"scan_seconds": 9.3,
"system": { /* 从 scan.json 的 system 字段直接复制 */ },
"top5": [
{"rank": 1, "tier": "red", "size": "约 7.6 GB", "type": "应用程序文件",
"name": "MobileAppEngine", "path": "C:\Program Files\MobileAppEngine",
"note": "华为手机助手模拟器,EmulatorSdk 占 7.4 GB"}
],
"green": [
{
"name": "WorkBuddy 桌面端更新缓存",
"path": "C:\Users\xxx\AppData\Local\@genieworkbuddy-desktop-updater",
"size_estimate": "约 450 MB",
"kill_processes": [],
"trash_paths": ["C:\Users\xxx\AppData\Local\@genieworkbuddy-desktop-updater"],
"commands": [
{"label": "PowerShell 移入回收站",
"cmd": "Remove-Item -Path "$env:LOCALAPPDATA\@genieworkbuddy-desktop-updater" -Recurse -Force"}
]
}
],
"yellow": [
{
"name": "WPS 双版本插件/模板",
"path": "C:\Users\xxx\AppData\Roaming\kingsoft",
"size": "约 4.4 GB",
"content_profile": "WPS 中文版+国际版数据。wps/addons 2.2GB,wps_international/addons 1.9GB。",
"why_manual": "涉及两个版本的共用数据,无法自动判断主要用哪版。",
"disposal": "只用中文版:wps_international/addons 1.9GB 可安全删除。",
"risk": "删除 wps_international 后国际版 WPS 启动时会重新下载插件。",
"trash_paths": ["C:\Users\xxx\AppData\Roaming\kingsoft\wps_international"]
}
],
"red": [
{
"name": "MobileAppEngine(华为手机助手)",
"path": "C:\Program Files\MobileAppEngine",
"size": "约 7.6 GB",
"why_keep": "7.4GB 为 EmulatorSdk Android 模拟器镜像。如果不用华为手机连电脑可卸载。",
"indirect_release": "设置→应用→已安装的应用→搜索 MobileAppEngine→卸载。释放约 7.6GB。",
"app_paths": ["C:\Program Files\MobileAppEngine"],
"auto_reclaim": "否,需手动卸载"
}
],
"denied": [],
"summary": {
"overview": "C 盘仅剩 4.3GB,最大占用是华为手机助手 7.6GB + WPS 数据 4.4GB。可立刻释放约 1.8GB。",
"tier_stats": {"green": "约 1.8 GB", "yellow": "约 15.0 GB", "red": "约 12.4 GB"},
"priority": [
"最优先:清除更新缓存 5 项约 1.8GB,零风险",
"其次:清理 WPS 国际版插件 1.9GB"
],
"long_term": [
"启用存储感知:设置→系统→存储→存储感知→开",
"定期 DISM:DISM /Online /Cleanup-Image /StartComponentCleanup",
"大文件迁移至 D 盘:D 盘还有 218GB 可用"
]
}
}
注意事项:
system字段直接复制 scan.json 的system,不要改动结构。trash_paths必须是真实存在的绝对路径数组,不能为空数组。- 🟡 项的
trash_paths只放核实过安全可移的子路径(如旧备份目录),不是整个path。 - 🟡 项如果没有安全子路径,
trash_paths留空或不写。 commands[].cmd写完整的可执行命令,用户可以直接复制到 PowerShell。
依赖
- Python 3.10+ (纯标准库,零 pip install)
- Windows 10 / 11(Windows 7 未测试)
平台状态
- Windows 10/11:完整实现并实测(扫描/报告/一键删除全验证)。
- 新增覆盖原版盲区:Installer、ProgramData、回收站、WinSxS、Windows Temp。
与原版 storage-analyzer 的差异
| 维度 | 原版 | Windows 版 |
|---|---|---|
| 平台 | macOS + Windows | Windows only |
| 扫描目标 | 7 组 (Win) | 12 组 + dev_caches |
| macOS 代码 | ~150 行 | 0 行 |
| 盲区 | ~65 GB | 已覆盖 |
| --quick 模式 | 无 | 有 |
| --cache 缓存 | 无 | 有 |
| 健康检查 | 无 | GET /health |
| 长路径处理 | 无 | \? 前缀 |
| 回收站查询 | 无 | Windows API |
| hiberfil/pagefile | 未检测 | 已检测 |
长期建议(写入报告 long_term)
- Windows 自带:
cleanmgr(磁盘清理)、存储感知(设置→系统→存储) - DISM 清理:
DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase - 第三方工具:WizTree(免费)、SpaceSniffer(免费)、TreeSize
- 大文件迁移至 D/E 盘;休眠关闭:
powercfg /hibernate off - 聊天软件缓存:微信/企微/钉钉定期在 App 内清理
更新日志
v2.0 — Windows-Native 重构 (2026-06-03)
基于原版 storage-analyzer (KKKKhazix/khazix-skills) 的完整逆向分析创建纯 Windows 实现。
修改动机:
- 原版 307 行 scan.py 中 ~150 行是 macOS-only 逻辑,Windows 用户无需携带
- 原版扫描盲区 ~65GB:Installer(31.5G) / ProgramData(4.7G) / 回收站(3.6G) / WinSxS(11.6G)
- 3 个 Windows 特有 bug:stdout 缓冲、SHFileOperationW 长路径、后台服务无存活检测
改动清单:
| 类型 | 项目 | 优势 |
|---|---|---|
| 新增 | 5 个系统级扫描目标(Installer/ProgramData/回收站/WinSxS/Windows Temp) | 扫描覆盖率从 ~35% 提升到 ~90% |
| 新增 | --quick 模式(0.2s 一级扫描 + 大文件自动聚合) |
首轮反馈从 14s 降到 0.2s,用户零等待 |
| 新增 | --cache 24h 缓存 + COMPUTERNAME 自动识别 |
二次扫描 <0.1s,消除重复扫描 |
| 新增 | GET /health 健康检查 + 启动自检 |
服务存活可感知,启动失败立刻报错 |
| 新增 | --min-mb 自定义阈值参数 |
大文件优先,用户可控粒度 |
| 新增 | hiberfil.sys / pagefile.sys 系统文件检测 |
休眠/虚拟内存占用可见,不再遗漏 |
| 删减 | 砍掉全部 macOS 代码(~150 行) | 代码量 -50%,Windows 专精,维护成本降低 |
| 修改 | Frontmatter 四段式结构化(做什么/何时用/触发词/反触发) | Agent 触发准确率提升,误触发减少 |
| 修改 | Step 3 6 条可勾选检查清单 + ⏸️ 确认门 | 防止 Agent 跳过用户审查,分级结果必须用户同意 |
| 修改 | 9 场景异常处理表 | 边界条件全覆盖(Python 未安装/空扫描/磁盘满/权限拒绝等) |
| 修改 | 11 种标签体系(含优先级链 + 互斥规则 + 正反例) | 分类准确率提升,名称去歧义(应用本体→应用程序文件) |
| 修改 | 附录 B 内联有效 JSON 模板(替代原版伪 JSON schema) | Agent 零推理写分析 JSON,照抄结构即可 |
| 优化 | Quick 模式 46 项→7 项(文件级自动聚合) | 用户一屏看完,不再被 40 个 .msp 淹没 |
| 优化 | 约束规则一章合并(铁律+确认门+异常处理) | 认知负荷 -60%,规则一次读完 |
| 优化 | Agent/Script 职责对照表 | 一眼知谁负责哪个阶段 |
| 修复 | os.path.isfile() → os.path.exists()(pagefile 检测) |
系统文件不再漏检 |
| 修复 | COMPUTERNAME → socket.gethostname() fallback |
缓存文件名不再显示 "unknown" |
| 修复 | 行缓冲 → sys.stdout.reconfigure(line_buffering=True) |
后台启动输出即时可见 |
| 修复 | \? 长路径前缀 + FOF_NOERRORUI |
260 字符路径不丢失,错误弹窗抑制 |
原版 vs Windows 版性能:
| 指标 | 原版 | Windows 版 |
|---|---|---|
| Quick 扫描 | — | 0.2s |
| 全量扫描 | 14.2s | 9.3s |
| 二次扫描(缓存命中) | 14.2s | <0.1s |
| 扫描覆盖率 | ~35% | ~90% |
| Quick 模式 Top 条目 | (无此模式) | 7 项(聚合后) |
| macOS 代码 | 150 行 | 0 行 |
v2.1 — HTML 空白页修复 (2026-06-05)
修复报告 HTML 在浏览器中显示空白的致命问题。根因:JSON 数据注入 HTML 时,3 个崩溃点会导致整个 块解析失败 → 页面空白。
崩溃点分析:
| 崩溃点 | 触发条件 | 后果 |
|---|---|---|
注入 |
JSON 中路径含 字符串 |
浏览器提前关闭 标签 → JS 块断裂 → 空白页 |
u2028/u2029 |
JSON 字符串含 Unicode 行/段分隔符 | 合法 JSON 但非法 JS → 语法错误 → 空白页 |
| amber/yellow 歧义 | Agent 写 amber 而非 yellow |
normalize 把 DATA.yellow 设为空数组 → 黄色项全部丢失 |
改动清单:
| 文件 | 类型 | 项目 | 说明 |
|---|---|---|---|
build_report.py |
新增 | validate() 结构验证函数 |
检查必需 top-level 键、amber/yellow 歧义、green/yellow/red 项必填字段、summary 完整性,输出诊断警告 |
build_report.py |
修复 | 三重安全转义 | → , |
build_report.py |
新增 | _warnings 注入数据 |
将结构验证警告传入模板,页面也能显示诊断提示 |
report_template.html |
修复 | amber→yellow / green_items→green 兼容 | Agent 写 amber 不再导致数据丢失 |
report_template.html |
修复 | 逐项字段补全 | green/yellow/red 每一项缺失的字段自动填安全默认值(如 content_profile → "暂无内容画像"),不再显示 undefined 或空白 |
report_template.html |
新增 | mount 函数结构诊断 | 检测 green/yellow/red 全空、缺少 size_estimate、缺少 content_profile 等问题,页面顶部显示警告横幅 |
report_template.html |
新增 | build_report 警告透传 | _warnings 数组中的验证警告也会在页面中显示 |
report_template.html |
修复 | catch 块增加调试信息 | JS 解析失败时不再空白,显示错误详情和原始数据片段 |
server.py |
修复 | 三重安全转义(同 build_report.py) | 服务模式下也不会因 / u2028 崩溃 |
server.py |
修复 | amber→yellow 兼容 | load() 函数自动将 amber 键重命名为 yellow |
测试验证:
| 测试场景 | 结果 |
|---|---|
| 标准 JSON(完全匹配附录B模板) | ✅ 正常渲染 |
| 不完美 JSON(amber 代替 yellow + red 缺必填字段) | ✅ 有警告横幅但正常渲染,数据不丢失 |
| 极端最小 JSON(只有 system 字段,无 green/yellow/red) | ✅ 优雅降级,页面显示警告而非空白 |
含 u2028/u2029 的 JSON |
✅ 正确转义为 u2028/u2029,不再触发 JS 语法错误 |
v2.2 — 一键清理绿色项(确认面板 + 串行删除 + 进度反馈) (2026-06-05)
在交互式网页中增加"一键清理"功能:确认面板让用户勾选要清理的绿色项,确认后逐项串行删除并实时显示进度,失败项跳过继续,最后显示结果摘要。
交互流程:
点击"一键清理全部 N 项 (约 X GB)" → 弹出确认面板
→ 面板列出所有绿色项(复选框 + 名称 + 路径 + 大小)
→ 用户勾选/取消 → 点击"确认移到废纸篓"或"直接删除"
→ 逐项串行调用 /action API
→ 每完成一项:更新进度条 + 状态标记(✓/✗)
→ 某项失败?跳过继续,记录错误
→ 全部完成:显示结果摘要(成功 N 项 / 失败 M 项 + 失败原因)
→ 用户点"关闭"
改动清单:
| 文件 | 类型 | 项目 | 说明 |
|---|---|---|---|
report_template.html |
新增 | 确认面板 UI(modal) | 半透明遮罩 + 居中弹窗 + 复选框列表 + 全选/取消全选 |
report_template.html |
新增 | openBatchModal() |
收集可清理绿色项,构建确认面板列表 |
report_template.html |
新增 | executeBatchClean(mode) |
async 串行逐项删除,实时更新进度条 + 状态标记 |
report_template.html |
新增 | 进度条 + 结果摘要 | 进度条动画 + 成功(绿)/部分成功(黄)/失败(红) 三色结果面板 |
report_template.html |
改进 | 绿色区醒目大按钮 | 原 btn-sm 改为 btn-lg,显示"🗑 一键清理全部 N 项 (约 X GB)" |
report_template.html |
新增 | 逐项状态 CSS | batch-cleaning(清理中)、batch-ok(✓)、batch-fail(✗) 三种卡片状态 |
report_template.html |
新增 | 点击遮罩关闭面板 | 点击 modal 外部遮罩区域自动关闭 |
report_template.html |
改进 | "直接删除"选项默认隐藏 | 需手动勾选"显示直接删除选项"才出现,防止误操作 |
report_template.html |
新增 | 静态模式提示 | 静态报告模式下点一键清理,提示用户使用 server.py 启动服务模式 |
关键设计决策:
- 串行而非并行删除:避免并发请求导致文件锁冲突或服务端过载
- 失败跳过而非中止:某项权限不足时跳过继续,最后汇总失败列表
- 默认只显示"移到废纸篓":安全可逆;"直接删除"需额外勾选才可见
- 确认面板可取消勾选:用户可以精确选择要清理哪些项,而非全有或全无
v2.2.1 — 修复 SHFileOperationW 类型错误 (2026-06-05)
修复"一键清理"全部失败的 bug。根因:_to_wide_null_terminated() 返回 bytes(encode("utf-16-le")),但 SHFILEOPSTRUCTW.pFrom 声明为 wintypes.LPCWSTR,ctypes 期望 str 而非 bytes,导致每次移到废纸篓都报错 unicode string or integer address expected instead of bytes instance。
修复:
_to_wide_null_terminated()返回str而非bytes- 注释同步更新:说明 ctypes 会自动将 Python
str转为 UTF-16 - 移除冗余的
import ctypes语句(该函数不再需要 ctypes) move_to_trash()增加错误码 120/124 回退逻辑:系统保护目录(如C:WindowsSoftwareDistributionDownload)或含被占用文件的目录无法移到回收站时,自动回退到hard_delete(),避免清理失败ALLOWED_ROOTS新增C:Program Files和C:Program Files (x86):修复 🔴 项"在资源管理器打开"时 L7 root boundary 拦截(如C:Program FilesAutodesk)report_template.html修复onclick属性中 Windows 路径反斜杠丢失:esc(p).replace(/'/g,"\'")增加.replace(/\/g,'\\'),防止 JS 字符串中P被当作无效转义序列吞掉反斜杠(如C:ProgramDataAutodesk变成C:ProgramDataAutodesk)
v2.3 — 设计级修复:JSON 解析方式 + 服务进程分离 (2026-06-05)
修复交互式网页始终显示为"静态模式"(DELETE = null)的根因问题,涉及两个独立 bug。
Bug 1:内联 JSON 赋值导致 JS 解析崩溃
| 因素 | 旧设计 | 新设计 |
|---|---|---|
| 数据注入方式 | DATA = {json};(直接赋值) |
+ JSON.parse() |
| DELETE 与 DATA | 同一个 try/catch 块 | 分离为两个独立 try/catch |
| u2028/u2029 | 需手动转义(遗漏则 JS 语法错误) | 不需要(JSON.parse 不经过 JS 语法解析器) |
| 内嵌浏览器兼容 | 大内联 JSON 导致 try 块整体失败 | JSON.parse 在所有浏览器中可靠 |
根因:旧设计把 JSON 直接当作 JS 表达式赋值(DATA = {json};),任何 JSON 合法但 JS 非法的字符(如 U+2028/U+2029)或某些内嵌浏览器对大内联 JSON 的处理差异,都会导致 try 块抛出异常 → catch 块设置 DELETE = null → 页面表现为"静态模式"。由于 DATA 和 DELETE 在同一个 try/catch 中,DATA 的错误连带使 DELETE 失效。
Bug 2:Bash run_in_background 超时杀进程
| 因素 | 旧方式 | 新方式 |
|---|---|---|
| 启动命令 | Bash run_in_background |
PowerShell Start-Process |
| 进程生命周期 | 绑定到 Bash 会话,2分钟超时被杀 | 完全独立,不受会话超时影响 |
| 端口发现 | 无 | --port-file 写入文件,延迟读取 |
| 打开方式 | preview_url(内嵌浏览器,交互功能不可用) |
Start-Process URL(用户默认浏览器) |
改动清单:
| 文件 | 类型 | 项目 | 说明 |
|---|---|---|---|
report_template.html |
重构 | 数据注入方式 | DATA = {json} → + JSON.parse(document.getElementById('__report_data__').textContent) |
report_template.html |
重构 | DELETE 解析 | 与 DATA 分离为独立 try/catch,DATA 失败不影响 DELETE |
report_template.html |
移除 | u2028/u2029 转义 | 不再需要(JSON.parse 不经过 JS 语法解析) |
server.py |
新增 | --port 参数 |
可指定固定端口(默认随机) |
server.py |
新增 | --port-file 参数 |
启动后写入 URL 到指定文件,供外部读取端口 |
server.py |
修复 | 线程模型 | daemon 线程 → 主线程 serve_forever + self-test 后台线程 |
server.py |
简化 | 转义逻辑 | 移除 u2028/u2029 转义(不再需要),仅保留 转义 |
build_report.py |
简化 | 转义逻辑 | 同上 |
SKILL.md |
更新 | Step 4 | 改用 Start-Process 启动 + 默认浏览器打开 |
热门AI工具
相关专题
开启被禁用的 Windows 更新:方法一:服务管理器中将其设置为自动启动并启动服务;方法二:Windows 设置中取消暂停更新;方法三:使用命令提示符启动 wuauserv 和 cryptSvc 服务并重启计算机。想了解更多相关内容,请阅读专题下面的文章。
3642
2025.03.27
此windows副本不是正版的解决办法:1、执行重新激活;2、使用命令提示符;3、调整服务设置;4、使用激活工具;5、更新系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
1479
2024.08.23
windows打印机无法打印可能是由连接、驱动程序、打印机设置、文档、墨水耗尽、纸张或硬件故障引起的。想了解更多windows的相关内容,可以阅读本专题下面的文章。
3374
2024.04.15
Windows驱动精灵是一个免费的驱动程序管理工具,可帮助您轻松查找、下载和安装丢失或过时的驱动程序。想了解更多驱动精灵的相关内容,可以阅读本专题下面的文章。
2978
2024.04.15
linux和windows的主要区别有:1. 内核:linux使用开源内核,而windows使用专有内核;2. 许可证和成本:linux大多免费开源,而windows需要购买许可证等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
6389
2024.04.12
热门下载
相关下载
精品课程


