使用Python轻松构建一个Windows11系统智能垃圾清理系统

 更新时间:2026年01月03日 09:46:36   作者:猫头虎  
Windows 11虽然引入了存储感知,但在面对深层开发缓存、老旧更新残留及特定应用日志时往往力不从心,本文将详解如何使用Python编写一套安全、智能、可配置的自动化清理脚本,有需要的小伙伴可以了解下

摘要:Windows 11虽然引入了存储感知,但在面对深层开发缓存、老旧更新残留及特定应用日志时往往力不从心。本文将详解如何使用Python编写一套安全、智能、可配置的自动化清理脚本,并结合Windows任务计划程序实现真正的“无人值守”维护

一、 问题背景与需求分析

1.1 为什么系统自带工具不够用

很多开发者或运维人员习惯使用 CleanMgr (磁盘清理) 或第三方清理软件(如CCleaner)。但在企业环境或开发环境下,它们存在以下缺陷:

  • 粒度太粗:无法精确到“删除超过7天的特定后缀日志”。
  • 风险不可控:第三方软件常有误删系统文件导致蓝屏的历史记录。
  • 缺乏集成:无法与现有的业务逻辑(如:清理前先备份数据库)结合。

1.2 我们的清理目标(Target Directories)

我们需要针对Windows 11系统特性,精准打击以下目录:

  • 用户临时目录 (%TEMP%):存放大量应用安装解压包、缓存。
  • 系统临时目录 (%WINDIR%\Temp):系统级临时文件。
  • 预读取数据 (Prefetch):虽然会自动生成,但长期不关机的用户积累较多。
  • 浏览器缓存 (Chrome/Edge):需要针对性清理,因为体积巨大。
  • Windows 更新日志 (%WINDIR%\Logs\CBS):系统更新后的残留。
  • 回收站:彻底删除不再需要的文件。

二、 技术方案设计

2.1 核心架构

为了确保安全,我们不使用简单的 rm -rf,而是采用 “扫描-过滤-校验-执行-日志” 的流水线架构。

  • 语言选择:Python 3.x(跨平台库丰富,文本处理强大)。
  • 安全机制
    • 白名单机制:即使文件在垃圾目录,如果文件名在白名单中(如正在锁定的文件),则跳过。
    • 时间策略:仅删除“超过N天未访问”的文件,防止误删刚生成的临时文件。
    • 模拟运行:增加 --dry-run 参数,只显示将要删除什么,不真删。

2.2 关键逻辑流程图

三、 代码实现

我们将项目分为两个文件:config.json(配置)和 smart_cleaner.py(核心逻辑)。

3.1 配置文件

这让非技术人员也能调整清理策略,而不需要改代码。

{
  "settings": {
    "dry_run": false,
    "days_old": 7,
    "file_extensions": [".tmp", ".log", ".cache", ".old", ".etl"],
    "max_file_size_mb": 500
  },
  "targets": [
    {
      "name": "User Temp",
      "path": "%TEMP%",
      "recursive": true
    },
    {
      "name": "System Temp",
      "path": "C:\\Windows\\Temp",
      "recursive": true
    },
    {
      "name": "Prefetch",
      "path": "C:\\Windows\\Prefetch",
      "recursive": false
    }
  ],
  "exclusions": [
    "desktop.ini",
    "thumbs.db"
  ]
}

3.2 核心脚本

import os
import sys
import json
import time
import logging
import shutil
import argparse
from datetime import datetime, timedelta
from pathlib import Path

# 初始化日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('cleaner.log'),
        logging.StreamHandler(sys.stdout)
    ]
)

class SmartCleaner:
    def __init__(self, config_path):
        self.config = self.load_config(config_path)
        self.stats = {'deleted_files': 0, 'freed_space': 0}
        self.now = time.time()
        
        # 计算时间阈值 (秒)
        self.days_threshold = self.config['settings'].get('days_old', 7)
        self.time_threshold = self.now - (self.days_threshold * 86400)

    def load_config(self, path):
        try:
            with open(path, 'r', encoding='utf-8') as f:
                return json.load(f)
        except FileNotFoundError:
            logging.error(f"配置文件 {path} 未找到")
            sys.exit(1)

    def get_file_size(self, filepath):
        return os.path.getsize(filepath)

    def is_excluded(self, filename):
        """检查文件是否在排除列表中"""
        exclusions = self.config.get('exclusions', [])
        return filename.lower() in [e.lower() for e in exclusions]

    def should_delete(self, filepath):
        """核心判断逻辑:是否满足删除条件"""
        try:
            # 1. 检查文件名白名单
            if self.is_excluded(os.path.basename(filepath)):
                return False
            
            # 2. 检查后缀 (如果配置了特定后缀)
            exts = self.config['settings'].get('file_extensions', [])
            if exts:
                if os.path.splitext(filepath)[1].lower() not in exts:
                    return False

            # 3. 检查访问时间 (是否为旧文件)
            # stat.st_atime 是访问时间,st_mtime 是修改时间。这里用 mtime 更稳妥。
            file_mtime = os.path.getmtime(filepath)
            if file_mtime > self.time_threshold:
                return False
            
            # 4. 检查文件大小 (防止误删正在写入的大文件)
            max_size = self.config['settings'].get('max_file_size_mb', 500) * 1024 * 1024
            if os.path.getsize(filepath) > max_size:
                logging.warning(f"文件过大跳过: {filepath}")
                return False

            return True
        except Exception as e:
            logging.warning(f"检查文件 {filepath} 时出错: {e}")
            return False

    def clean_path(self, target_info):
        """清理指定目录"""
        raw_path = target_info['path']
        # Windows环境变量展开
        path = os.path.expandvars(raw_path)
        recursive = target_info.get('recursive', True)

        if not os.path.exists(path):
            logging.warning(f"目录不存在,跳过: {path}")
            return

        logging.info(f"正在扫描: {path} (递归: {recursive})")
        
        if recursive:
            walker = os.walk(path, topdown=False)
        else:
            # 非递归模式下,只处理当前目录文件
            walker = [(path, [], os.listdir(path))]

        for root, dirs, files in walker:
            for file in files:
                file_path = os.path.join(root, file)
                
                if self.should_delete(file_path):
                    self.perform_delete(file_path)

    def perform_delete(self, filepath):
        """执行删除动作"""
        try:
            size = self.get_file_size(filepath)
            
            if self.config['settings']['dry_run']:
                logging.info(f"[模拟] 将删除: {filepath} ({size/1024/1024:.2f} MB)")
            else:
                # 先尝试删除文件,如果文件被占用会抛出异常
                os.remove(filepath)
                logging.info(f"[已删除] {filepath}")
                
            self.stats['deleted_files'] += 1
            self.stats['freed_space'] += size
            
        except PermissionError:
            logging.debug(f"权限不足/文件被占用,跳过: {filepath}")
        except Exception as e:
            logging.error(f"删除 {filepath} 失败: {e}")

    def clean_empty_dirs(self, target_info):
        """可选:清理空文件夹"""
        path = os.path.expandvars(target_info['path'])
        if not target_info.get('recursive', True): return
        
        logging.info(f"正在清理空文件夹: {path}")
        for root, dirs, files in os.walk(path, topdown=False):
            for dir_name in dirs:
                dir_path = os.path.join(root, dir_name)
                try:
                    if not os.listdir(dir_path): # 目录为空
                        if not self.config['settings']['dry_run']:
                            os.rmdir(dir_path)
                            logging.info(f"[已删除空目录] {dir_path}")
                        else:
                            logging.info(f"[模拟] 将删除空目录: {dir_path}")
                except OSError:
                    pass

    def run(self):
        start_time = datetime.now()
        logging.info(f"===== 任务开始 (模拟模式: {self.config['settings']['dry_run']}) =====")

        for target in self.config['targets']:
            self.clean_path(target)
            # self.clean_empty_dirs(target) # 如需删除空文件夹可取消注释

        end_time = datetime.now()
        duration = (end_time - start_time).total_seconds()
        
        logging.info("===== 任务完成 =====")
        logging.info(f"扫描文件数: {self.stats['deleted_files']}")
        logging.info(f"释放空间: {self.stats['freed_space'] / 1024 / 1024:.2f} MB")
        logging.info(f"耗时: {duration:.2f} 秒")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Windows 智能清理脚本")
    parser.add_argument('--dry-run', action='store_true', help='模拟运行,不实际删除文件')
    args = parser.parse_args()

    # 如果命令行传参,覆盖配置文件
    config_file = 'config.json'
    cleaner = SmartCleaner(config_file)
    
    if args.dry_run:
        cleaner.config['settings']['dry_run'] = True
        
    cleaner.run()

四、 深度解析关键技术点

4.1 处理文件被占用的问题

在Windows中,直接删除 TEMP 目录下的文件经常会遇到 PermissionError。脚本中使用了 try...except PermissionError 捕获块。

  • 原理:如果文件正在被某个进程使用(如 .log 文件正在写入),系统内核会锁定句柄。
  • 策略:捕获到异常后仅仅记录 Debug 级别日志,不中断程序。这保证了脚本不会因为几个删不掉的文件而崩掉。

4.2 环境变量与路径处理

Windows路径可能包含空格或特殊字符。代码中使用 os.path.expandvars 自动将 %TEMP% 转换为 C:\Users\Username\AppData\Local\Temp,极大地增强了配置的通用性。你可以直接在 config.json 中写入标准的Windows环境变量。

4.3 安全时间阈值

这是脚本“智能”的核心。我们不删除所有 .tmp 文件,而是检查 os.path.getmtime

  • 例如设置 days_old: 7
  • 场景:你刚刚下载了一个安装包,它解压在 Temp 目录,你正在安装。脚本运行时,发现这个文件是“5分钟前”创建的,小于7天,于是保留它。这保证了程序运行期间的稳定性。

五、 自动化部署

有了脚本,我们需要让它定期运行。Windows 11 的“任务计划程序”是最佳选择。

5.1 创建计划任务步骤

1、打开任务计划程序:按 Win + S,搜索 Task Scheduler

2、创建基本任务:右侧点击 “Create Basic Task”。

  • Name: Weekly System Cleaner
  • Trigger: Weekly (建议选每周,或每月),选择具体时间(如周五晚上 22:00)。

3、设置动作

  • 选择 Start a program
  • Program/script: python.exe 的完整路径(例如 C:\Python39\python.exe)。
  • Add arguments: 脚本的完整路径(例如 D:\Scripts\smart_cleaner.py)。
  • Start in (可选): 脚本所在的目录(D:\Scripts),这有助于Python正确找到 config.json

4、高级设置

  • 勾选 Run with highest privileges(以最高权限运行),否则清理 C:\Windows\Temp 可能会报权限错误。
  • 在“Conditions”标签页,勾选 Start the task only if the computer is idle for...(仅在电脑空闲时运行),防止在你工作时突然卡顿。

5.2 效果监控

每次脚本运行后,会在同目录下生成 cleaner.log。你可以定期查看日志,确认:

  • 是否有频繁出现的 PermissionError(可能有顽固软件一直在锁定文件)。
  • 每次释放了多少空间,验证清理效果。

六、 总结与进阶

这套方案相比传统的批处理脚本(.bat)具有极高的可维护性。

后续进阶方向:

  • 邮件通知:使用 Python 的 smtplib 库,在任务跑完后,自动发送一封包含“释放空间数量”的邮件到管理员邮箱。
  • 浏览器缓存:Chrome 和 Edge 的 SQLite 数据库文件在打开时是锁定的。可以通过调用浏览器命令行参数 --disk-cache-dir 来指定缓存位置,或者在清理脚本中增加关闭浏览器进程的逻辑。
  • 图形化界面:使用 PySimpleGUI 为这个脚本套一层壳,做成一个绿色小工具,方便公司非技术人员使用。

通过这篇文章,你已经拥有了一个工业级的、安全的Windows 11自动化清理解决方案。立即部署,让C盘重回“满血”状态吧!

以上就是使用Python轻松构建一个Windows11系统智能垃圾清理系统的详细内容,更多关于Python Windows垃圾清理的资料请关注脚本之家其它相关文章!

相关文章

  • jupyter notebook读取/导出文件/图片实例

    jupyter notebook读取/导出文件/图片实例

    这篇文章主要介绍了jupyter notebook读取/导出文件/图片实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 使用Python实现获取文件详细信息

    使用Python实现获取文件详细信息

    Python提供了丰富的内置模块和函数,获取和操作文件的各种属性信息,比如大小、修改时间、权限以及路径等,本文将通过详细的示例代码展示如何使用Python中的os和os.path模块来获取文件属性信息,需要的可以参考下
    2023-12-12
  • Pytorch卷积神经网络迁移学习的目标及好处

    Pytorch卷积神经网络迁移学习的目标及好处

    这篇文章主要为大家介绍了Pytorch卷积神经网络迁移学习的目标实现代码及好处介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python3实现计算两个数组的交集算法示例

    Python3实现计算两个数组的交集算法示例

    这篇文章主要介绍了Python3实现计算两个数组的交集算法,结合2个实例形式总结分析了Python3针对数组的遍历、位运算以及元素的添加、删除等相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • 为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)

    为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)

    这篇文章主要介绍了为何人工智能(AI)首选Python,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python实现自动合并Word并添加分页符

    Python实现自动合并Word并添加分页符

    这篇文章主要为大家详细介绍了如何基于Python实现对多个Word文档加以自动合并,并在每次合并时按要求增添一个分页符的功能,感兴趣的可以了解一下
    2023-02-02
  • pytest内置fixture使用临时目录流程详解

    pytest内置fixture使用临时目录流程详解

    fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在
    2022-12-12
  • 如何使用Typora+MinIO+Python代码打造舒适协作环境

    如何使用Typora+MinIO+Python代码打造舒适协作环境

    这篇文章主要介绍了如何使用Typora+MinIO+Python代码打造舒适协作环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Python如何省略括号方法详解

    Python如何省略括号方法详解

    这篇文章主要介绍了Python如何省略括号方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python数据解析bs4库使用BeautifulSoup方法示例

    Python数据解析bs4库使用BeautifulSoup方法示例

    这篇文章主要为大家介绍了Python数据解析bs4库使用BeautifulSoup方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论