C盘清理脚本分享

📅 发布时间:2026/9/24 8:52:07
C盘清理脚本分享
C盘清理脚本分享作者没有四次元口袋的蓝胖日期2026-09-23标签PowerShell, Windows, 磁盘管理自动化脚本C 盘又满了几乎是每个 Windows 用户都经历过的痛。以前我的处理方式是装个 “电脑管家”点一下 “一键清理”然后赌它不会误删我的文件。后来我决定自己写一个 —— 不装第三方软件、可复现、可审计还能一键发给朋友用。于是就有了这个c-drive-guard脚本。这篇文章完整拆解它的设计思路和核心逻辑每个关键函数都配上代码和 “为什么这么写”。核心掌握分级调度空间越紧张查得越勤、自调度脚本自己改闹钟、两级清理用户级 / 系统级、白名单安全范式、盘符自动检测、一键分发。一、需求与方案取舍1.1 痛点系统越用越卡软件更新失败想清理却不知道哪些能删、哪些不能删装第三方 “清理大师”担心来源不明、误删文件、有隐私风险所以我定的目标是不装第三方软件、可复现、可审计、还能一键分发给非技术用户。1.2 为什么不用 WMI 事件订阅需求里有个矛盾既要 “空间不足时自动响应”又要 “能一键分发给别人”。我对比过两条路线方案优点缺点WMI 事件订阅近实时触发空间不足立即执行配置需管理员权限不好分发底层仍是系统轮询计划任务 分级调度最终选它普通权限可安装一键分发逻辑透明触发有延迟但对本场景足够结论防止 C 盘变满不是 “秒级响应” 的实时场景定时分级的可靠性完全够用而且换来了 “双击即用” 的分发体验。这个取舍是值得的。1.3 整体架构双击 安装\_C盘守护.bat #x20; │ #x20; ├─ 自我提权(UAC) ──────────────► 注册计划任务(最高权限运行) #x20; │ #x20; ▼ #x20; 计划任务 CDriveGuard #x20; │ (每小时触发一次) #x20; ▼ #x20; c\_drive\_guard.ps1 #x20; │ #x20; ├─ 读取 C 盘剩余空间 #x20; ├─ 分级决定下次检查间隔 ────► 重设计划任务(自调度) #x20; │ #x20; └─ 剩余 10GB 时执行: #x20; ├─ 清理用户级缓存(临时/浏览器/缩略图/着色器/npm) #x20; ├─ \[管理员时] 清理系统级缓存(更新/日志/WER) #x20; └─ 移动 Downloads 到目标盘(自动检测)二、自动分级调度2.1 检查频率和剩余空间成反比脚本每次运行的第一件事是读 C 盘剩余空间然后据此决定下次多久再查\$freeGB \[math]::Round((Get-PSDrive C).Free / 1GB, 2) if (\$freeGB -ge 20) { \$intervalH 24\*7; \$level 充裕(20GB) - 每7天 } elseif (\$freeGB -ge 15) { \$intervalH 24; \$level 偏紧(15-20GB) - 每天 } else { \$intervalH 1; \$level 紧张(15GB) - 每小时 }为什么这样设计固定高频每 30 分钟一次→ 浪费资源一直打扰系统固定低频每周一次→ 空间骤降时响应太慢自适应频率→ 空间越紧张查得越勤空间充足时自动 “躺平”一句话检查频率和剩余空间成反比。2.2 自调度脚本自己改自己的 “闹钟”分级调度不是靠外部定时器而是脚本每次运行后主动重设计划任务的触发时间\$nextRun (Get-Date).AddHours(\$intervalH) \$trig New-ScheduledTaskTrigger -Once -At \$nextRun Set-ScheduledTask -TaskName \$TaskName -Trigger \$trig -ErrorAction Stop这是整个脚本里最巧妙的一环计划任务只负责 “每 1 小时唤醒一次”但脚本被唤醒后立刻把下次触发改到 “该查的时间”。相当于脚本自己给自己定合适的闹钟而不是靠外部傻等。2.3 设计要点 / 常见坑点重设任务失败不能中断主流程用try/catch包住失败只写日志警告不影响本次清理结果。分级阈值20/15/10GB集中成参数方便不同机器定制不要散落在代码里。检查频率再高也不要在同一脚本里循环等交给系统调度脚本保持 “一次运行即退出”。三、目标盘自动检测3.1 盘符不能写死为了把脚本分发给不同的人盘符写死就废了。这里做了一个自动检测function Get-TargetDrive { #x20; \$sys (Get-PSDrive C).Name #x20; if (Test-Path D:\\) { return D } # 优先 D 盘 #x20; # 否则找剩余空间最大的非系统盘 #x20; \$best \$null; \$bestFree 0 #x20; Get-PSDrive -PSProvider FileSystem | #x20; Where-Object { $\_.Name -ne \$sys -and $\_.Name -ne D } | #x20; ForEach-Object { #x20; if ($\_.Free -gt \$bestFree) { \$best $\_.Name; \$bestFree $\_.Free } #x20; } #x20; return \$best }3.2 优先级逻辑D 盘 剩余空间最大的非系统盘。如果只有 C 盘返回空脚本跳过移动、只做清理。这样换电脑、换用户名、有没有 D 盘都能正常工作。3.3 常见坑点只排除了 C 盘和 D 盘还不够要遍历所有文件系统盘U 盘、移动硬盘也可能挂载所以用Where-Object动态过滤。返回空值要有兜底if (-not $target) { 跳过移动 }别让空盘符直接拼路径导致报错。四、两级清理用户级 vs 系统级4.1 两类缓存处理方式完全不同级别例子需要管理员处理方式用户级缓存临时文件、浏览器缓存、缩略图、着色器缓存、npm 缓存❌ 不需要任何电脑都能清系统级缓存Windows 更新缓存、系统日志、WER 错误报告✅ 需要有权限才清没有自动跳过4.2 管理员判断\$isAdmin (\[Security.Principal.WindowsPrincipal] #x20; \[Security.Principal.WindowsIdentity]::GetCurrent() ).IsInRole(\[Security.Principal.WindowsBuiltInRole]::Administrator) \# ... if (\$isAdmin) { #x20; # 系统级缓存(更新缓存/日志/WER/蓝屏转储) } else { #x20; Log \[跳过] 非管理员, 跳过系统级缓存 }这个设计保证一个关键点用普通权限装也能清掉大头用户级缓存不影响主功能。系统级清理是 “锦上添花”不是 “必需”。4.3 常见坑点清 Windows 更新缓存前必须先停 wuauserv 服务清完只在原本运行时才重启不能无脑Start-Service否则会改变系统原有状态。缩略图缓存只删thumbcache_*文件同目录其他文件比如图标缓存不能动。五、安全清理范式5.1 核心函数 CleanDirfunction CleanDir(\$label, \$path) { #x20; if (-not (Test-Path \$path)) { return } #x20; # 先量出大小 #x20; \$size (Get-ChildItem \$path -Recurse -Force | Measure-Object Length -Sum).Sum #x20; # 只删目录内容, 不删目录本身 #x20; Get-ChildItem \$path -Force | Remove-Item -Recurse -Force #x20; # 删完再量一次, 算出真实释放量(被占用的会自动跳过) #x20; \$after (Get-ChildItem \$path -Recurse -Force | Measure-Object Length -Sum).Sum #x20; \$delta \$size - \$after #x20; \$script:freed \$delta }几个细节体现了 “安全优先”只删内容、不删目录本身避免破坏路径结构被占用 / 无权限的文件自动跳过SilentlyContinue不强制解锁、不杀进程删除前后各量一次大小只把 “真实释放量” 记入统计不虚报5.2 白名单清理什么用户临时文件%TEMP%浏览器缓存只清Cache/Code Cache绝不碰书签、历史、密码缩略图缓存只清thumbcache_*文件着色器缓存D3D、NVIDIAnpm 缓存系统日志、错误报告、蓝屏转储Windows 更新缓存先停服务、清完只在原本运行时才重启5.3 黑名单绝不碰什么桌面 / 文档 / 图片 / 视频等个人文件已安装软件系统核心文件回收站六、文件移动有用的才搬走清理针对的是 “可再生垃圾”而个人文件有保留价值不能删只能搬。脚本把 C 盘 Downloads 目录里的内容移动到目标盘\# 移动前先检查目标盘剩余空间, 至少留 1GB 余量 if (\$dFree -gt (\$sz 1GB)) { #x20; Move-Item -LiteralPath $\_.FullName -Destination \$dst -Force #x20; # ... } else { #x20; Log \[跳过] 目标盘空间不足 }一个务实的细节移动前先看目标盘空间够不够不够就跳过避免 “搬了一半塞不下”。七、一键分发7.1 安装器流程双击 安装\_C盘守护.bat #x20; → 检测到非管理员, 自动触发 UAC 提权 #x20; → 点是 #x20; → 注册计划任务(以最高权限运行, RunLevelHighest) #x20; → 立即运行一次验证 #x20; → 完成, 之后全自动关键点RunLevelHighest 的计划任务由系统调度启动不经过 UAC 弹窗自动以管理员身份运行。所以只需双击一次、点一次 “是”之后就有权限了。7.2 朋友使用两个文件放同一文件夹 → 双击.bat→ 点 “是” → 结束。⚠️ 公司受管电脑不建议使用注册自启 提权任务可能违反 IT 政策且移动下载目录可能涉及工作数据。工作电脑建议用系统自带清理或先问 IT。️ 思维导图速览C盘守护脚本 ├── 方案取舍 │ ├── 计划任务 分级调度(弃用WMI: 不好分发/需管理员) │ └── 一键安装器(.bat UAC RunLevel Highest) ├── 自动分级调度 │ ├── 20GB → 每7天 │ ├── 15\~20GB → 每天 │ ├── 15GB → 每小时 │ └── 自调度: 运行后重设下次触发时间 ├── 目标盘自动检测 │ ├── 优先 D 盘 │ └── 否则找剩余空间最大的非系统盘 ├── 两级清理 │ ├── 用户级缓存(无需管理员): 临时/浏览器/缩略图/着色器/npm │ └── 系统级缓存(需管理员): 更新缓存/日志/WER ├── 安全清理范式 │ ├── 白名单: 只清可再生缓存 │ ├── 黑名单: 个人文件/软件/系统核心/回收站 │ ├── 只删内容不删目录 │ └── 删前后各量一次, 只记真实释放量 └── 文件移动 #x20; ├── 只搬个人文件(Downloads) #x20; └── 移动前检查目标盘空间(留1GB余量) 写在最后使用建议先手动跑一次看日志powershell -ExecutionPolicy Bypass -File c_drive_guard.ps1确认输出符合预期再安装计划任务。日志会越积越大建议定期清空C:\Users\Public\c_drive_guard.log后续版本可加滚动日志。用前先确认是个人电脑、自己能装软件再用公司电脑不要用。相关链接项目仓库github.com/146413702/c-drive-guard技术栈PowerShell 5.1 / Windows 任务计划程序无第三方依赖