桌面清理与分类归档器
把一堆散落的桌面/目录文件,整理成"找得到 + 不会误删"的状态。
零、三条铁律(先看这个,比流程重要)
铁律 1:扫描阶段只读。 第一遍绝不移动、绝不删除任何东西。先出一份带类型/大小/时间的完整清单给用户看。
铁律 2:绝不硬删。 不用 rm、不用 del /F、不用 Remove-Item 处理"待清理"文件。原因见第三节——回收站 API 在本环境走不通,必须用"可恢复暂存目录"替代。
铁律 3:乱的原因通常是"项数多",不是"体积大"。 先算体积账再定目标。一个桌面 42 项 / 1.3G,可能 99.9% 体积只集中在 1 个文件夹里,15 个 zip 加起来才 688K。实测:把 20 个"没用"的文件全删掉只省 1MB。 所以目标要定成"找东西快 + 防误删",别对用户承诺"腾出空间"。
一、五步流程
Step 1 — 只读扫描,先把账摊开
用 PowerShell(-Force 才能看见隐藏的 desktop.ini):
$rows = @()
Get-ChildItem -LiteralPath "C:\Users\你的用户名\Desktop" -Force | ForEach-Object {
$t = if ($_.PSIsContainer) { "文件夹" }
elseif ($_.Extension -eq ".lnk") { "快捷方式" }
elseif ($_.Extension -eq ".url") { "网页快捷方式" }
elseif ($_.Name -eq "desktop.ini") { "系统文件" }
else { "文件" }
$rows += [PSCustomObject]@{
Type = $t; Name = $_.Name
Size = if ($_.PSIsContainer) { "-" } else { [string]$_.Length }
Modified = $_.LastWriteTime.ToString("yyyy-MM-dd HH:mm")
}
}
$rows | Sort-Object Type, Name | Format-Table -AutoSize |
Out-File -FilePath "<工作目录>\scan.txt" -Encoding UTF8 -Width 300
输出重定向到文件再读——PowerShell 在本环境的 stdout 经常不回显。
两个易漏点:
-
公共桌面
C:\Users\Public\Desktop里的 .lnk 是系统安装项,不在用户桌面目录里,但会显示在桌面图标上。不要碰(删了等于卸快捷方式)。 -
判断"这是不是素材类文件夹"要看体积。
du -sh一眼看出谁是 1.3G 的大家伙。
Step 2 — 查重判定(不能凭文件名像就下结论)
三类"没用"的文件,判定方法各不相同:
(a) 安装包 .zip —— 交叉核对技能库
技能装好后,安装包就是冗余。逐个核对 ~/.workbuddy/skills/:
ls "/c/Users/你的用户名/.workbuddy/skills/" | grep -v "^\." | nl
注意中英文双名对应:短视频剪辑发布复盘器.zip 和 short-video-edit-publish-review.zip 可能是同一个技能的两个中文/英文版本。小红书爆款拆解器.zip 与 -v1.1.0.zip 是新旧版本,都要核。
(b) 文档 .md —— 必须 md5 逐字节比对
不要凭文件名相同就删。 桌面版可能更新过:
a=$(md5sum "桌面文件.md" | cut -d' ' -f1)
b=$(md5sum "知识库/同名文件.md" | cut -d' ' -f1)
[ "$a" = "$b" ] && echo "完全一致,可清" || echo "内容不同,保留!"
(c) 压缩包 vs 文件夹同名 —— 数内部条目
import zipfile
z = zipfile.ZipFile(r'路径\某文件夹.zip')
print(len([n for n in z.namelist() if not n.endswith('/')]))
条目数与同名文件夹一致 → zip 是冗余副本。
Step 3 — 挑出"混在素材里的业务文件"
大素材文件夹里常混着不该一起搬走的东西(本次案例:1.3G 视频素材目录里塞着 茉莉飘雪类目价格表.pdf 和 茶品知识库卡.csv)。
动手前先 ls -la 看全清单,把业务文件挑到业务目录,别跟着素材一起沉到 D 盘深处。
Step 4 — 搬迁:三重校验后才删源
& robocopy $src $dst /E /R:1 /W:1 /NFL /NDL /NP /NJH /NJS | Out-Null
# ① 文件数比对 ② 总字节比对 ③ 抽样 md5(Get-FileHash)
$a = Get-ChildItem -LiteralPath $src -Recurse -File
$b = Get-ChildItem -LiteralPath $dst -Recurse -File
# 两者 .Count 与 (Measure-Object -Property Length -Sum).Sum 必须相等
三项全过才 Remove-Item -LiteralPath $src -Recurse -Force。
robocopy 退出码 0–7 都算成功,8+ 才是失败。
为什么必须三重校验:本次实测中,一个 30 张图的源目录在复制完成后、计划删除前就异常消失了(原因未查明,脚本 exit code 1 且日志未写)。因为先复制+校验过,数据一分没丢。 没有这层保险就是事故。
Step 5 — 交付索引文件
必须给用户一份"东西都去哪了"的索引(放在分类文件夹内,不占桌面)。否则过三天他找不到搬走的东西,会以为被删了。
索引必含:① 桌面现在剩什么 ② 每个分类文件夹装了什么 ③ 素材搬到哪了 ④ 待清理文件在哪、怎么取回、怎么彻底删。
二、分类方案(按性质分,不按格式分)
实测好用的三类:
| 文件夹 | 装什么 |
|---|---|
| 业务文档 | 用户自己的产出(方案、清单、说明书)、产品文档、业务参考资料 |
| 学习资料 | 读书笔记、课程笔记、实验记录 |
| 技能资料 | 技能源文件夹、提示词库、行业资料 |
应用快捷方式(.lnk)全部留在桌面 —— 用户天天要点,收进文件夹反而添麻烦。
⚠️ 命名陷阱:遇到 新建文件夹、新建文件夹 (2)、123 这种名字,先看内容再定去留再改名。这类文件夹里躺着的往往是核心资产(本次「新建文件夹」= 1.3G 素材,「新建文件夹 (2)」= 价值产品文档)。名字最危险的地方,通常装着最重要的东西。
三、🔴 关键坑:回收站通道走不通
在本环境里,把文件送进回收站的两种标准方法都被安全策略拦截:
| 方法 | 被拦原因 |
|---|---|
| New-Object -ComObject WScript.Shell / Shell.Application | COM object instantiation can run arbitrary code |
| Add-Type -AssemblyName Microsoft.VisualBasic + FileSystem::DeleteFile(..., SendToRecycleBin) | Add-Type compiles and loads .NET code at runtime |
替代方案(已实测可用):建一个明确命名的可恢复暂存目录,用 Move-Item 把待清理文件移进去。
New-Item -ItemType Directory -Force -Path "D:\桌面清理_YYYY-MM-DD_可恢复" | Out-Null
Move-Item -LiteralPath $file -Destination "D:\桌面清理_YYYY-MM-DD_可恢复" -Force
然后在交付说明里写清两句话:
-
想取回 → 从这里剪回去
-
想彻底删 → 确认无误后删掉整个文件夹
这比回收站更好:位置明确、用户能看见、还能在里面翻。同时天然满足"不硬删"的安全要求。
四、批量操作纪律
-
每批 ≤ 10 个文件,逐批验证后再下一批
-
中文文件名用
-LiteralPath,不要用-Path(方括号等字符会被当通配符) -
移动前先
Test-Path -LiteralPath确认存在,失败项单独记进日志,不要中断整批 -
所有批量操作写日志文件,最后统一读取核对(stdout 不可靠)
-
如果脚本中途 exit code 1 但日志没写,停下来用
ls实地核查,不要盲目重跑 —— 可能已经部分执行
五、验证素材完整性(如需确认搬过去的文件没坏)
FF="/d/FFmpeg/bin/ffprobe.exe"
# 视频/音频:能解析出时长即为完好
"$FF" -v error -show_entries format=duration,size -of csv=p=0 "$f"
# 图片:同法,能解析出宽高即完好
"$FF" -v error -show_entries stream=width,height -of csv=p=0 "$f"
# pptx / docx / xlsx:zipfile 内部校验
import zipfile; print(zipfile.ZipFile(p).testzip()) # None = 无损坏
六、交付话术要点
-
先结论:桌面从 N 项 → M 项,体积变化
-
说清"乱的原因":如果体积账显示删掉也不省空间,直说,别让用户以为清理能提速
-
列清每一类去向(表格)
-
待清理清单逐条列路径,说明"未销毁、可恢复"
-
如实报异常:中途任何与计划不符的操作,必须说明并给出独立验证结果
-
数字自己核:zip 数量、项数这类,用脚本数,别手数(手工计数两个方向都会错)