如何使用 Windows BAT 批处理脚本递归删除指定后缀文件(附:完整代码,复制可用)


前言

在实际的软件开发中,我们经常会面对各种自动化需求,其中一种十分常见的场景是:批量删除某个目录(含子目录)下的指定后缀文件

比如:

  • Unity 工程中大量 .meta 文件需要清理
  • Android/Java 构建中遗留的 .class.tmp 文件需要移除
  • Git 测试版本遗留 .private 文件需要删除
  • 项目编译残留 .bak.log 文件需要整理

虽然手动删除也能做到,但复杂工程往往包含成千上万文件。
此时,一个自动化的批处理(BAT)脚本能瞬间提升工作效率。

本篇文章将从需求分析、脚本设计、交互优化到实际使用,带你完整实现一个:“支持用户输入后缀、自动定位 BAT 父目录、递归删除指定后缀文件”的完美脚本。

并提供了一个可直接使用的成品脚本供你复制。


一、需求背景与场景分析

在你当前的项目(包括 Unity、Android、VR 相关开发工具链)中,批量文件管理是一个常见需求:

  • Unity 中 .meta 文件数量巨大,有时需要批量清理迁移后遗留的 meta
  • 个人工具封装后需要一键清除工程中的临时资源
  • 大量自动生成的文本文件 .txt.generated.cache 需要快速移除
  • VR 工程中用脚本生成的中间 .asset_temp 文件会影响构建

同时,你提出一个核心需求:

“删除当前 BAT 文件的父文件夹下所有指定后缀文件,并希望脚本支持控制台输入文件后缀,提示要英文化、交互友好。”

这其实包含 3 层核心需求:


1. 自动定位 BAT 的父目录

普通脚本必须手动写死路径,比如:

D:\MyProject

但你的需求是:

脚本放在哪里,就自动清理它上一级目录。

即:

... \Tools\delete.bat

会自动作用于:

...\

这让脚本可以随工程移动,非常适合版本管理和共享工具。


2. 递归删除(包括所有子目录)

Windows 批处理的 for /r 语句可以轻松做到这一点。

例如:

for /r "%FOLDER%" %%f in (*.meta) do ...

即可扫描所有子目录。


3. 支持交互式输入文件后缀

即运行脚本时由用户输入:

meta
tmp
log
private

无需修改 bat 本身。

这让脚本极其通用、可扩展。


二、设计思路

为了让脚本更通用、更易懂、更安全,我们将整个 BAT 脚本设计分为以下几个模块:


1. 自动识别脚本路径与父目录

使用以下语句:

set "CUR_DIR=%~dp0"
for %%i in ("%CUR_DIR%\..") do set "PARENT_DIR=%%~fi"

其中:

  • %~dp0 代表当前 BAT 所在文件夹路径
  • ..\ 代表上一级目录(父目录)
  • %%~fi 提取路径标准格式

最终 PARENT_DIR 即是目标操作目录。


2. 友好交互:输入文件后缀

set /p EXT=Please enter the file extension to delete:

为什么不加点?

因为避免用户输入 .meta 导致脚本生成 ..meta

让用户输入:

meta

脚本自动组合:

*.meta

最优雅也最安全。


3. 删除前确认机制

避免误删是非常重要的。
所以设计一个确认:

Are you sure? (Y/N):

并加入大小写不敏感判断:

if /i "%confirm%" neq "Y" ...

这保证用户必须明确输入大写或小写 Y 才执行删除。


4. 递归删除文件

核心命令:

for /r "%PARENT_DIR%" %%f in (*.%EXT%) do del /f /q "%%f"

其中:

  • /r → 递归扫描所有子目录
  • /f → 强制删除(甚至只读)
  • /q → 静默(不出现确认提示)
  • "%%f" → 每个文件路径

为了给用户反馈,我们会打印:

Deleting: xxx...

确保用户知道脚本在做什么。


三、使用方式

假设目录结构如下:

D:\Project\
 ├─ Assets\
 ├─ Scripts\
 └─ Tools\
      └─ delete_by_suffix.bat

当你运行 BAT:

Please enter the file extension to delete (example: meta): meta

脚本会自动清理:

D:\Project\

下的所有 .meta 文件,包括子目录:

  • Assets\xxx.meta
  • Scripts\yyy.meta
  • 任意深度的文件夹

不需要你每次改脚本路径。
这对 Unity 工程特别友好。


四、总结

本篇文章从一个简单的需求出发,扩展到了完整的脚本设计、增强、工程化实践。

最终得到了一个通用脚本工具。

无论你在:

  • Unity 项目清理 .meta
  • 安卓项目清理 .tmp
  • 版本管理清理 .private
  • 工程构建清理 .cache
  • 自定义工具链批量处理临时文件

都能使用这个脚本,无需任何修改。

1. 运行截图

2. 流程图

3. 完整代码

复制即可使用

@echo off
::----------------------------------------------------
:: Delete files with a user-specified extension
:: in the parent folder of this BAT script
::----------------------------------------------------

:: Get current script directory
set "CUR_DIR=%~dp0"

:: Get the parent folder
for %%i in ("%CUR_DIR%\..") do set "PARENT_DIR=%%~fi"

echo.
echo ===============================================
echo  Current BAT Directory:
echo  %CUR_DIR%
echo.
echo  Target Parent Folder:
echo  %PARENT_DIR%
echo ===============================================
echo.

:: Ask user to input extension
set /p EXT=Please enter the file extension to delete (example: meta): 

if "%EXT%"=="" (
    echo [Error] The extension cannot be empty!
    pause
    exit /b
)

echo.
echo You entered: .%EXT%
set /p confirm=Are you sure you want to delete all .%EXT% files? (Y/N): 

if /i "%confirm%" neq "Y" (
    echo Operation canceled.
    pause
    exit /b
)

echo.
echo Deleting all .%EXT% files under %PARENT_DIR% ...
echo.

:: Recursive delete
for /r "%PARENT_DIR%" %%f in (*.%EXT%) do (
    echo Deleting: %%f
    del /f /q "%%f"
)

echo.
echo ===============================================
echo  All .%EXT% files have been deleted successfully!
echo ===============================================
pause

Logo

这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!

更多推荐