目录
- 一、创作动机
- 二、脚本的作用
- 三、脚本做了什么(详细说明)
- 3.1 环境准备
- 3.2 扫描与统计
- 3.3 清理当前目录
- 3.4 遍历子目录清理
- 3.5 统计报告
- 四、脚本代码
- 五、逻辑流程
- 六、使用方法
- 七、下载
一、创作动机
作为一名 Qt/QML 开发者,你一定遇到过这样的情况:
辛辛苦苦写了数十个示例工程,目录结构整整齐齐,某天想把这些工程打包发出去或者备份到网盘时,却发现压缩包大得离谱。仔细一看,原来每个工程目录下都残留着build文件夹、CMakeLists.txt.user文件等编译产物。一个小工程可能只有几百 KB 的源码,但编译后动辄几十 MB,几十个工程加起来就是好几个 GB。
如果一开始就做好了统一的编译输出管理(比如设置CMAKE_BINARY_DIR指向外部目录),自然不会遇到这个问题。但现实往往是:项目太多了,前期没有规范,后期已经来不及逐个修改了。
这时候,你有几个选择:
- 手动删除—— 几十个目录挨个进去删,枯燥且容易遗漏。
- 交给 AI 写脚本—— AI 生成的代码不一定可靠,万一误删了源码就麻烦了。
- 自己写一个固定的脚本—— 一劳永逸。脚本逻辑确定、行为可控,以后每次打包前双击运行即可。
这个脚本正是为第三种场景而生的。
二、脚本的作用
一句话概括:递归清除当前目录下所有 Qt/QML 工程的编译产物,不动源码一根汗毛。
具体清理的目标文件/文件夹:
| 目标 | 类型 | 说明 |
|---|---|---|
build/ | 目录 | CMake 默认的构建输出目录,包含所有 .o、.exe、.a 等编译产物 |
CMakeLists.txt.user | 文件 | Qt Creator 的工程配置文件,记录了编译选项、断点等 IDE 信息 |
这两个东西是 Qt/QML 工程中最常见的"垃圾文件"。build目录是体积大户,一个 Release 构建动辄几十上百 MB;.user文件则因人而异,提交到 Git 仓库时通常也会被.gitignore忽略。
脚本只会删除上述两类目标,其他所有文件 ——.cpp、.qml、.h、CMakeLists.txt、资源文件、图片、文档等 —— 全部原封不动。
三、脚本做了什么(详细说明)
脚本的实际行为可以拆解为以下几个层面:
3.1 环境准备
- 设置
UTF-8编码(chcp 65001),确保中文路径和提示信息正常显示。 - 切换到脚本自身所在的目录(
cd /d "%~dp0"),无论从哪里双击运行,都只清理脚本所在目录下的内容。 - 启用延迟变量扩展(
EnableDelayedExpansion),确保循环中变量值正确更新。
3.2 扫描与统计
- 先遍历一级子目录,统计工程总数,显示进度条时使用。
- 设置三个计数器:
count(已删除数量)、errors(失败数量)、current(当前处理序号)。
3.3 清理当前目录
- 当前目录下如果存在
build文件夹,删除。 - 当前目录下如果存在
CMakeLists.txt.user文件,删除。 - 这一步处理的是脚本直接所在目录的情况(比如脚本放在所有工程的根目录,而根目录本身也是一个 Qt 工程)。
3.4 遍历子目录清理
- 遍历所有一级子目录,对每个目录执行相同的清理逻辑:
- 删除
子目录/build文件夹 - 删除
子目录/CMakeLists.txt.user文件
- 删除
- 每一步都有成功/失败的状态反馈。
3.5 统计报告
- 输出清理统计:总工程数、成功删除数、失败数。
- 如果有删除失败的情况(通常是权限不足或被其他进程占用),给出明确的警告提示。
四、脚本代码
@echo off setlocal EnableDelayedExpansion chcp 65001 >nul cd /d "%~dp0" echo ======================================== echo Qt Project Cleanup Tool echo ======================================== echo Base Directory: %cd% pause echo Start Time: %date% %time% echo. set count=0 set errors=0 set total_dirs=0 set current=0 REM Count total directories first for /d %%p in (*) do ( set /a total_dirs+=1 ) echo Found %total_dirs% project directories echo. echo ---------------------------------------- echo Starting cleanup... echo. REM Clean current directory first set "root_has_items=0" echo [ROOT] Processing current directory if exist "build" ( rd /s /q "build" 2>nul if errorlevel 1 ( echo [FAILED] build set /a errors+=1 ) else ( echo [DELETED] build set /a count+=1 set "root_has_items=1" ) ) if exist "CMakeLists.txt.user" ( del /f /q "CMakeLists.txt.user" 2>nul if errorlevel 1 ( echo [FAILED] CMakeLists.txt.user set /a errors+=1 ) else ( echo [DELETED] CMakeLists.txt.user set /a count+=1 set "root_has_items=1" ) ) if "!root_has_items!"=="0" ( echo [NO ITEMS] ) echo. REM Clean subdirectories for /d %%p in (*) do ( set /a current+=1 echo [!current!/%total_dirs%] Processing: %%p set "has_deleted=0" if exist "%%p\build" ( rd /s /q "%%p\build" 2>nul if errorlevel 1 ( echo [FAILED] %%p\build set /a errors+=1 ) else ( echo [DELETED] %%p\build set /a count+=1 set "has_deleted=1" ) ) if exist "%%p\CMakeLists.txt.user" ( del /f /q "%%p\CMakeLists.txt.user" 2>nul if errorlevel 1 ( echo [FAILED] %%p\CMakeLists.txt.user set /a errors+=1 ) else ( echo [DELETED] %%p\CMakeLists.txt.user set /a count+=1 set "has_deleted=1" ) ) if "!has_deleted!"=="0" ( echo [NO ITEMS] ) echo. ) echo ---------------------------------------- echo Cleanup Complete! echo. echo ============ Statistics ============ echo Total Projects: %total_dirs% echo Deleted: %count% items echo Failed: %errors% items echo End Time: %date% %time% echo ==================================== echo. if %errors% gtr 0 ( echo [WARNING] %errors% items failed to delete. Check permissions. echo. ) echo Press Enter to exit... pause endlocal五、逻辑流程
整个脚本的执行流程如下:
关键设计决策:
- 不递归进入子目录的子目录:只处理一级子目录。这是有意为之的,因为 Qt 工程通常是一级目录一个工程,深层嵌套会大幅增加风险和复杂度。如果确实需要更深层级的清理,可以手动调整或运行多次。
- 存在性检查优先于删除:先
if exist再执行删除,避免对不存在的路径误操作。 - 逐条反馈,不留盲区:每一条删除操作都有明确的状态输出,用户随时可以检查日志,确认没有误删。
- 失败不中断:某个文件/目录删除失败不会中断整个流程,而是记录错误数并在最后统一报告。
六、使用方法
运行效果:
- 将
cleanup_projects.bat复制到你的 Qt 工程集合的根目录下。 - 双击运行,或者从命令行执行。
- 等待脚本执行完毕,确认统计信息无误。
- 按 Enter 退出,此时编译文件已被清空。
个人建议:
- 放在所有工程的父目录运行,而不是每个工程里放一个。
- 配合
.gitignore使用,在仓库中忽略build/和*.user文件,从根本上避免这类文件被提交。 - 对于未来新建的 Qt 工程,建议统一设置
CMAKE_BINARY_DIR到外部路径,从根源上避免编译产物散落在源码目录中。
七、下载
脚本下载链接:https://gitcode.com/u011186532/qml_demo/blob/main/cleanup_projects.bat
无需额外依赖,Windows 系统原生支持。
本脚本专为 Qt/QML 工程开发,适用于 Windows 平台。用于其他类型的 CMake 工程也可能有效,但请先确认清理目标是否合适。