起因

Windows 用久了:临时文件、日志、图标缓存、缩略图缓存一路堆积,C 盘越来越满;“此电脑”里还塞着一排用不到的系统文件夹。网上流传的清理 bat 一大把,但黑盒不敢跑——用 Python 自己写一个,每一行删的是什么自己说了算。

需求

  • 一键清理:系统临时文件、prefetch、minidump、图标/缩略图缓存、最近访问痕迹
  • 顺手把“此电脑”里的多余文件夹(桌面/文档/下载等那排)从显示里去掉

技术实现原理

脚本清理的其实是四类东西

临时文件(temp、prefetch、minidump——系统本来就会重建的数据)、缓存文件(图标缓存 IconCache.db、缩略图缓存 thumbcache_*.db——删了系统重建,能治图标显示错乱)、使用痕迹(Recent 最近访问、托盘图标记忆 TrayNotify)、注册表命名空间显示(见下)。

为什么删图标缓存前要杀 explorer

图标和缩略图缓存文件正被 explorer.exe 占用着——Windows 不允许删除被占用的文件。所以脚本的动作链是:taskkill 杀掉 explorer → attrib 去掉隐藏/系统/只读属性(这些属性会挡住 del)→ del 删除 → start explorer 重启外壳。任务栏消失几秒再回来,就是这个过程的正常表现。

remove_files 的两个细节

  • glob.glob() 默认不递归os.path.join(systemdrive, '*.tmp') 只匹配系统盘根目录一层,不是全盘扫描——网上老清理脚本的传统写法,真正占空间的大头在后面 temp/prefetch 那些目录里;
  • 每个删除都包在 try/except 里:正在被占用的文件删不掉会抛异常,捕获后打印继续,一个文件失败不至于中断整个清理。

注册表那段在删什么

Explorer\MyComputer\NameSpace 下的这些 GUID 是“此电脑”里那排系统文件夹(桌面、文档、下载、图片、音乐、视频、3D 对象)的注册表标识。删掉键的效果是它们不再显示在“此电脑”里,磁盘上的真实文件夹原封不动——这是改“显示”,不是删“数据”。

前提条件

安装Python3.10

直接下载连接:https://www.python.org/ftp/python/3.10.6/python-3.10.6-amd64.exe

如果无法下载,就去官方网站下载: https://www.python.org/downloads/windows/

新建clean.py文件

文件内容如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# 清理系统垃圾
import glob
import os
import winreg


def remove_files(rootdir, ext):
    '''
    清理rootdir目录下的符合的文件
    '''
    for i in glob.glob(os.path.join(rootdir, ext)):
        try:
            os.remove(i)
        except Exception as e:
            print(e)


def remove_reg_os(regs):
    '''
    清理系统注册表
    '''
    reg = winreg.CreateKey(
        winreg.HKEY_LOCAL_MACHINE,
        r'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace'
    )
    try:
        for name in regs:
            winreg.DeleteKey(reg, name)
    except Exception as e:
        print(e)
    winreg.CloseKey(reg)


def remove_reg_user(regs):
    '''
    清理用户注册表
    '''
    reg = winreg.CreateKey(
        winreg.HKEY_CURRENT_USER,
        r'Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace'
    )
    try:
        for name in regs:
            winreg.DeleteKey(reg, name)
    except Exception as e:
        print(e)
    winreg.CloseKey(reg)


if __name__ == "__main__":
    #删除系统库
    regs = [
        r'{E701A357-F43B-42c9-98D1-96B6C11EAD87}',
        r'{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}',
        r'{d3162b92-9365-467a-956b-92703aca08af}',
        r'{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}',
        r'{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}',
        r'{088e3905-0323-4b02-9826-5d99428e115f}',
        r'{24ad3ad4-a569-4530-98e1-ab02f9417aa8}'
    ]
    remove_reg_user(regs)

    #删除默认文件夹(库)
    systemdrive = os.getenv('systemdrive')
    #清除系统盘下临时文件
    remove_files(systemdrive, '*.tmp')
    #清除系统盘下文件
    remove_files(systemdrive, '*._mp')
    #清除系统盘下日志文件
    remove_files(systemdrive, '*.log')
    #清除系统盘下文件
    remove_files(systemdrive, '*.gid')
    #清除系统盘下文件
    remove_files(systemdrive, '*.chk')
    #清除系统盘下旧文件
    remove_files(systemdrive, '*.old')

    windir = os.getenv('windir')
    #清除系统目录下备份文件
    remove_files(windir, '*.bak')
    #清除系统目录下临时文件
    remove_files(windir, '*.tmp')
    #清除系统目录下临时文件夹
    remove_files(os.path.join(windir, 'temp'), '*.*')
    #清除系统目录下文件
    remove_files(os.path.join(windir, 'prefetch'), '*.*')

    systemroot = os.getenv('systemroot')
    #清除系统目录下dump文件夹
    remove_files(os.path.join(systemroot, 'minidump'), '*.*')
    #清除系统目录下文件
    remove_files(os.path.join(systemroot, 'prefetch'), '*.*')

    allusersprofile = os.getenv('allusersprofile')
    #清除软件数据
    # remove_files(os.path.join(allusersprofile, 'Documents'), '*.*')

    temp = os.getenv('temp')
    #清除用户temp目录下文件
    remove_files(temp, '*.*')

    userprofile = os.getenv('userprofile')
    #清除用户最近访问记录
    remove_files(os.path.join(userprofile, 'Recent'), '*.*')
    #清除用户最近office访问记录
    remove_files(
        os.path.join(userprofile,
                     'AppData\\Roaming\\Microsoft\\Office\\Recent'), '*.*')
    #清除用户本地temp
    remove_files(os.path.join(userprofile, 'AppData\\Local\\Temp'), '*.*')

    #清除图标缓存
    #关闭Windows外壳程序explorer
    os.system(r'taskkill /f /im explorer.exe')
    os.system(r'attrib -h -s -r "%userprofile%\AppData\Local\IconCache.db"')
    os.system(r'del /f "%userprofile%\AppData\Local\IconCache.db"')
    os.system(
        r'attrib /s /d -h -s -r "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\*"'
    )
    os.system(
        r'del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_32.db"'
    )
    os.system(
        r'del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_96.db"'
    )
    os.system(
        r'del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_102.db"'
    )
    os.system(
        r'del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db"'
    )
    os.system(
        r'del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_1024.db"'
    )
    os.system(
        r'del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_idx.db"'
    )
    os.system(
        r'del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_sr.db"'
    )
    #清理 系统托盘记忆的图标
    os.system(
        r'echo y|reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v IconStreams'
    )
    os.system(
        r'echo y|reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v PastIconsStream'
    )
    #重启Windows外壳程序explorer
    os.system(r'start explorer.exe')

脚本说明

  • 路径全部来自 os.getenv() 环境变量(windir、systemroot、temp、userprofile……),换机器不用改脚本;
  • 两套手段配合:Python 自己的 glob/os.remove 清普通文件;图标缓存那段用 os.system() 调 cmd 命令(taskkill/attrib/del),其中 %userprofile% 这种写法是 cmd 的变量展开(os.system 走的是 cmd.exe),和 Python 的字符串没有关系;
  • 注册表用 winreg 模块:remove_reg_user 清当前用户的 NameSpace(脚本实际调用的只有它);remove_reg_os 清系统级的(HKLM,需要管理员权限),代码里备着但没调用,要用自己加一行;
  • 结尾的 TrayNotify 两条是在清托盘“记忆”的旧图标。

运行

开始-》运行-》输入cmd回车打开命令行,

输入以下命令:

1
python clean.py

回车开始执行。

踩坑记录与注意事项

  • 权限决定清理范围:以管理员身份运行 cmd 再执行脚本,temp、minidump、HKLM 级注册表才动得了;普通权限下这些操作会大量 Permission denied(脚本不会崩,但清不干净);
  • 报错刷屏是正常的:被占用的文件删不掉会打印异常继续跑,看到一串 [WinError 32] 不用管;
  • 清 prefetch 有代价:prefetch 是 Windows 的预读取数据,删掉后一段时间内应用启动会变慢(系统边用边重建),不是纯赚不赔的操作,追求极致开机速度的反而该留着;
  • ** Recent / 痕迹清理涉及个人习惯**:清掉最近访问记录后,各软件“最近文件”列表也会空,用得顺手的要先想清楚;
  • 缩略图缓存删完首遍浏览会慢:资源管理器重新生成缩略图需要时间,属预期行为;
  • 想全盘清理把 glob 改递归glob.glob(os.path.join(root, '**', ext), recursive=True),但全盘递归 *.log 会误伤应用数据,建议只在明确的安全目录里递归;
  • 先跑 dry-run 更稳:把 os.remove 换成 print 看一遍会删什么,确认无误再动真格。