Install
openclaw skills install @zp-home/pc-space-cleanupWindows 10/11 上 C/D 盘空间不足时的体检与腾空间流程:只读盘点大目录 → 清开发缓存 → 项目打包 → 上传到 CloudDrive2 挂载的网盘(如 123 云盘)并逐文件校验 → 用户确认后删本地 → 整理云端目录。当用户说「C 盘满了 / 清理磁盘 / 整理空间 / 哪些文件可以传云盘 / 传到网盘 / 整理云盘」时使用;含 CloudDrive 先写本地缓存、切网后上传卡住、PowerShell 5.1 中文路径乱码等坑。上云部分要求本机装有 CloudDrive2 并已挂载网盘盘符。
openclaw skills install @zp-home/pc-space-cleanup一次真实整理的参考量级:C 盘剩余 42GB → 76GB,D 盘 16GB → 37GB,上云约 37GB,前后两天。
下文用到的约定:
| 变量 | 含义 | 示例 |
|---|---|---|
$SK | 本 skill 所在目录 | $SK = "$env:USERPROFILE\.claude\skills\pc-space-cleanup" |
$WORK | 工作目录(日志、暂存 zip、备份) | $WORK = "$env:USERPROFILE\pc-optimize-backup" |
$R | CloudDrive 挂载的网盘根目录 | $R = 'Z:\123云盘' |
$PY | 真实的 python.exe(别用 WindowsApps 下的商店别名) | (Get-Command python).Source 确认不在 WindowsApps 里 |
_待删除,看不懂的移进 _待确认,让用户自己删。xwechat_files、企业微信 Documents\WXWork。| 项 | 怎么查 | 备注 |
|---|---|---|
| 硬盘与分区 | Get-PhysicalDisk; Get-PSDrive -PSProvider FileSystem | 单盘分 C/D 时,D 腾出的空间帮不了 C |
| 网盘挂载 | Get-PSDrive 里 CloudFS 类型的盘符 | 下面可能挂多个网盘,确认目标根目录 $R |
| CloudDrive 本地缓存 | API GetSystemSettings 字段 4;常见在 $env:LOCALAPPDATA\CloudDrive.WinUI\temp | 通常在 C 盘 |
| CloudDrive API | http://127.0.0.1:<端口>,默认 19798,以 CloudDrive 设置为准 | gRPC-Web,Authorization: Bearer <API 令牌>;令牌找用户要,放 $env:CD2_TOKEN;端口不是默认值时设 $env:CD2_URL |
| node 包管理器 | Get-Command npm,yarn,pnpm | 调 .cmd,.ps1 可能被执行策略拦 |
| 打包 | 系统自带 C:\Windows\system32\tar.exe | 不假设装了 7z |
| 管理员 | Claude Code 会话默认不是管理员 | DISM / 改服务 / pagefile 要用户开管理员终端 |
目录大小用 robocopy /L 统计,比 Get-ChildItem -Recurse | Measure 快一个数量级:
function Size($p){ $o = robocopy $p "C:\__nonexist__" /L /S /NJH /BYTES /NFL /NDL /NC /NP /R:0 /W:0 /XJ 2>$null | Select-String '^\s*(Bytes|字节)\s*:'; if($o){ [double](($o.Line -split ':')[1].Trim() -split '\s+')[0] } else {0} }
依次看 C:\、D:\、$env:USERPROFILE、AppData\Local、AppData\Roaming 的一级子目录,再往大的里钻。
常见大头:Docker docker_data.vhdx、Documents\Virtual Machines、旧版微信 Documents\WeChat Files、
.android\avd、音乐 / 游戏客户端装在 C 盘根目录、pagefile.sys。
C 盘空间莫名在掉时,先查这几个(实测一次合计 ~8.5GB 就是它们):
Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending' # True = 更新装了一半
Size 'C:\Windows\WinSxS' # 装更新后可涨好几 GB,重启 + DISM 才能回收
Get-ChildItem "$env:LOCALAPPDATA\Feishu" -Directory # 飞书自动升级会并存新旧两版 ~2GB
npm.cmd cache clean --force # 实测 7.3GB → 0.45GB
& $PY -m pip cache purge # 走真实 python,避开坏的 WindowsApps\pip.exe
Remove-Item "$env:LOCALAPPDATA\uv\cache" -Recurse -Force # 仅当 uv 已不用;在用就 `uv cache clean`
yarn.cmd cache clean # 只清 Yarn\Cache\v6;Yarn\Berry 不会动
pnpm.cmd store prune # store 里多数被引用时回收很少
# Temp:只删 7 天前的文件,被占用的跳过
.gradle / .m2 / .cache / JetBrains 缓存重建成本高,列给用户自己决定。
小文件多的目录(实测一个项目目录 13.7 万个文件,九成是 node_modules/build)直接传 CloudDrive 极慢。
打 zip 并剔除可再生目录,保留 .git(历史不可重建):
$stg = "$WORK\staging"
tar.exe -a -c -f "$stg\$name.zip" --options 'zip:hdrcharset=UTF-8' `
--exclude node_modules --exclude target --exclude build --exclude dist --exclude .gradle --exclude .svn `
-C "$env:USERPROFILE\Desktop" $name
# 自检:zip 里不应再有被排除的目录
(tar.exe -t -f "$stg\$name.zip" | Where-Object { $_ -match '(^|/)(node_modules|target|build|dist|\.gradle|\.svn)/' }).Count # 应为 0
.svn 剔除前问用户:只影响能否直接 svn update,代码和未提交改动都在工作文件里。写一份 JSON 清单(UTF-8 带不带 BOM 都行,PowerShell 用 -Encoding UTF8 读),然后:
$env:CD2_TOKEN = '<用户给的令牌>' # 只放环境变量,不写进任何文件
powershell -NoProfile -ExecutionPolicy Bypass -File "$SK\scripts\upload.ps1" -Manifest <清单.json> # 拷入 → 等队列清空 → 等 60s → 逐文件校验
powershell -NoProfile -ExecutionPolicy Bypass -File "$SK\scripts\verify.ps1" -Manifest <清单.json> # 只校验(中断后、或换网回来后用)
清单格式(type:dir 整个目录镜像到 dst;file 单文件放进 dst 目录;files 把 src 下匹配 filter 的文件放进 dst):
{ "log": "C:\\Users\\<you>\\pc-optimize-backup\\upload_log.txt",
"batches": [
{ "name": "项目备份", "items": [
{ "type": "files", "src": "C:\\Users\\<you>\\pc-optimize-backup\\staging", "dst": "Z:\\123云盘\\项目备份\\桌面归档_20261015", "filter": "*.zip" } ] },
{ "name": "学习资料", "items": [
{ "type": "dir", "src": "D:\\Downloads\\某课程", "dst": "Z:\\123云盘\\学习资料\\某课程" },
{ "type": "file", "src": "C:\\Users\\<you>\\Desktop\\a.rar", "dst": "Z:\\123云盘\\学习资料" } ] } ] }
全局排除:*.baiduyun.p.downloading(百度网盘未下完的残片,直接删不上传)、~$*、.accelerate。
每批拷入量控制在 ~10GB 内:缓存在 C 盘,拷多少 C 盘就先少多少,传完才释放。
云端分类沿用用户已有习惯:先列 $R 的一级目录给用户看,项目一个项目一个 zip 进「项目备份」类目录,其余按已有分类归位;没有合适分类时问用户,不自己发明一套。
scripts/cd2.py)$cd2 = "$SK\scripts\cd2.py"
& $PY -I $cd2 GetUploadFileCount # 返回 "1: N";队列空时没有字段 1
& $PY -I $cd2 GetUploadFileList 0801 # 0801 = getAll:true
& $PY -I $cd2 PauseAllUploadFiles; & $PY -I $cd2 ResumeAllUploadFiles
& $PY -I $cd2 GetSystemSettings
字段含义是从返回值和现象对出来的,没有 proto 文件;哪天对不上先回来质疑这张表:
| 返回 | 字段 | 含义 | 依据 |
|---|---|---|---|
| GetUploadFileList 顶层 | 1 / 4 / 5 | 队列文件数 / 总字节 / 已传字节 | 随上传递减、和测试文件大小吻合 |
| 每个任务(字段 2 里) | 2 / 3 / 4 / 5 | 云端路径 / 文件字节 / 已传字节 / 状态 | 状态见过 WaitingforPreprocessing Preprocessing Inqueue Transfer Pause |
| GetSystemSettings | 2 / 3 | 同时预处理数 / 同时上传数 | 和队列里恒为 Preprocessing=N、Transfer=N 一致 |
| GetSystemSettings | 4 / 7 / 11 / 12 | 缓存目录 / 写入后延迟上传秒数 / 下载、上传限速(0=不限) | 4 与实测缓存位置一致;其余按顺序推断 |
中文路径在 PowerShell 里会显示成 ����,只影响显示,数值字段可用。验证于 CloudDrive 1.1.x。
CloudDrive 盘符上的 Move-Item 是云端改路径,不下载不重传:实测 11.55GB 的目录移动用时 0.93s。
用 scripts/reorg-lib.ps1 里的 Into / Merge,同名自动加 _2 后缀不覆盖:
$R = 'Z:\123云盘'; $LOG = "$WORK\reorg_log.txt"
. "$SK\scripts\reorg-lib.ps1"
Into 'xxx.zip' '游戏\整合包' # 把根目录的 xxx.zip 移进 游戏\整合包\
Merge '旧目录名' '新分类\子目录' # 子项全部并入,搬空后原目录进 _待删除
Summary
scripts/peek_zip.py(只读末尾目录区,不下载整包)。134217728、2550136832,都是 128MB 整数倍),
CloudDrive 进程 30 秒内磁盘读 / 其他 I/O 都是 0.0MB。换到能用的网络后有过自行恢复;在卡住的网络上
PauseAllUploadFiles → ResumeAllUploadFiles 没有用。任务管理器里看到"还在传、只是慢"时,
最终确实传完了——先多观察几分钟再判断是否要重启 CloudDrive(重启让用户从托盘"退出"再开,别强杀)。.INI 一起丢,疑似秒传去重),补传即可。.ps1 当成 GBK,中文路径全乱:
tar.exe: ...: Couldn't visit directory: No such file or directory,建出来的目录名是 妗岄潰(本应是 桌面)。
含中文的 .ps1 一律存成带 BOM 的 UTF-8:
[IO.File]::WriteAllText($f, [IO.File]::ReadAllText($f,[Text.Encoding]::UTF8), (New-Object Text.UTF8Encoding $true))@( @('files', $src, $dst, '*.zip') ) 会变成 4 个字符串,脚本报"0 个文件"且不报错。
要写 @( ,@(...) );本 skill 改用 JSON 清单彻底避开。Dir:别名优先于函数,dir = Get-ChildItem,建目录变成列目录:
Cannot find path '<当前目录>\游戏\整合包' because it does not exist. 随后所有移动 Could not find a part of the path.00A0,按普通空格拼路径 Test-Path 为 False。用 -like '前缀*' 取真实名。Program 'pip.exe' failed to run: The system cannot find the file specified —— 命中了 WindowsApps\pip.exe 商店别名,改用 & $PY -m pip。LastBootUpTime 不变、RebootPending 仍为 True,更新装不完。
要让用户点 开始 → 电源 → 重启。verify.ps1 即可;被杀的任务不要自行重启,先报告。The process cannot access the file 'application.asar' because it is being used by another process.
没有任何进程从该目录启动,多半是杀软在扫;重启后再删。clouddriveconf.json:里面是网盘账号的 refresh_token 和加密密码。缓存路径等配置用 API GetSystemSettings 读。Get-Counter '\Process(*)\% Processor Time' 偶发 The data in one of the performance counter samples is not valid.,结果仍可用。< 8 都算成功,1 = 有文件被复制。log\<日期>.log 可能是 0 字节,看日志查不出上传问题;只能走 API。GetUploadFileList 的已传字节按块跳变(32MB / 128MB),1 分钟不动不一定是卡死,要配合进程 I/O 一起看。Dism /Online /Cleanup-Image /StartComponentCleanup(先真重启)、不用的服务改手动、pagefile 改系统管理(实测可再回收 12–15GB)。Documents\WeChat Files(先核对是否已迁到新版,再整体上云后删,删前退出微信)。_待删除、_待确认 等用户过目。