Windows批处理脚本(.bat)完全指南:从入门到实战

目录

  1. 什么是批处理脚本
  2. 批处理脚本基础语法
  3. 常用命令详解
  4. 变量与路径处理
  5. 实战案例:资源打包脚本解析
  6. 高级技巧与最佳实践
  7. 常见问题与解决方案
  8. 总结

什么是批处理脚本

批处理脚本(Batch Script)是 Windows 下的自动化脚本,扩展名为 .bat.cmd。它可批量执行命令,常用于自动化任务、资源打包、环境配置等。

为什么使用批处理脚本?

  • 自动化重复任务
  • 批量处理文件
  • 简化复杂操作流程
  • 提高工作效率

批处理脚本基础语法

1. 基本结构

@echo off
REM 这是注释
echo Hello World
pause

2. 注释方式

批处理脚本支持两种注释方式:

:: 这是注释方式1(推荐,执行更快)
REM 这是注释方式2(更明确)

区别:

  • :::被当作无效标签处理,执行速度更快
  • REM:真正的注释命令,语义更明确

3. 关闭命令回显

@echo off

作用: 执行命令时不显示命令本身,只显示输出结果,让输出更清晰。

对比:

@echo off
echo Hello
REM 输出:Hello

echo on
echo Hello
REM 输出:
REM C:\>echo Hello
REM Hello

常用命令详解

1. SET - 设置变量

SET 变量名=值
SET PATH_BAT=%~dp0
SET OUTPUT=C:\output\

注意事项:

  • 等号两边不能有空格
  • 变量名不区分大小写
  • 使用变量时用 %变量名% 包裹

2. ECHO - 输出信息

echo Hello World
echo %PATH_BAT%
echo.  REM 输出空行

3. DEL - 删除文件

DEL 文件路径
DEL %OUTPUT%*.bin        REM 删除所有.bin文件
DEL /Q %OUTPUT%*.bin     REM 静默删除(不提示)

4. IF - 条件判断

IF EXIST 文件路径 (
    命令
)

IF NOT EXIST %OUTPUT%alarm.bin (
    echo 文件不存在
)

5. FOR - 循环

FOR %%变量 IN (集合) DO (
    命令
)

FOR %%F IN (*.txt) DO (
    echo %%F
)

6. CALL - 调用其他脚本

CALL 其他脚本.bat
CALL 其他脚本.bat 参数1 参数2

变量与路径处理

1. 特殊变量

批处理脚本提供了一些特殊变量:

%0    REM 脚本名称
%1    REM 第一个参数
%2    REM 第二个参数
%~dp0 REM 脚本所在目录(包含盘符和路径)
%~d0  REM 脚本所在盘符
%~p0  REM 脚本所在路径
%~n0  REM 脚本文件名(不含扩展名)
%~x0  REM 脚本扩展名

示例:

@echo off
echo 脚本路径: %~dp0
echo 脚本名称: %~n0
echo 第一个参数: %1

2. 路径操作

SET PATH_BAT=%~dp0
SET PARENT_DIR=%PATH_BAT%..\..\src
SET OUTPUT=%PATH_BAT%..\..\bin\res\images\

路径说明:

  • .\当前目录
  • ..\ 表示上一级目录
  • %~dp0 获取脚本所在目录的完整路径

3. 延迟变量扩展

在循环或代码块中使用变量时,需要启用延迟变量扩展:

SETLOCAL ENABLEDELAYEDEXPANSION

FOR /L %%I IN (1,1,10) DO (
    SET VAR=%%I
    echo !VAR!  REM 使用 ! 而不是 %
)

区别:

  • 普通变量:%VAR%
  • 延迟扩展:!VAR!

实战案例:资源打包脚本解析

下面是一个完整的资源打包脚本,我们逐行解析:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET PATH_BAT=%~dp0
SET RES_CFG=%PATH_BAT%\..\..\src\inc\cfg\sk_cfg_com.h
SET ROMFILE_SRC=%PATH_BAT%..\..\bin\res\dev
SET ROMFILE_PACKER=%PATH_BAT%..\bin\windows\romfile_packer\romfile_packer.exe
SET ANIM_SRC=%PATH_BAT%..\..\bin\res\raw\anim
SET ANIM_PACKER=%PATH_BAT%..\bin\windows\anim_packer\anim_packer.exe
SET ANIM_CFG=%PATH_BAT%\..\..\src\skhal\include\board.h
SET OUTPUT=%PATH_BAT%..\..\bin\res\images\
SET ANIM_HEADER=%PATH_BAT%\..\..\bin\res\images\anim_res.h

::delete all images
DEL %OUTPUT%*.bin

::romfile
%ROMFILE_PACKER% --batch --res-cfg %RES_CFG% --output-dir %OUTPUT% %ROMFILE_SRC%

::jpg
%ANIM_PACKER% -i %ANIM_SRC% -o %OUTPUT% -b %ANIM_CFG% --res-cfg %RES_CFG% --header %ANIM_HEADER% --fps 25 --delay-hide-time 40

@pause

逐行解析

第1行:@echo off

关闭命令回显,让输出更简洁。

第2行:SETLOCAL ENABLEDELAYEDEXPANSION

启用延迟变量扩展,确保在代码块中正确获取变量值。

第3行:SET PATH_BAT=%~dp0

获取脚本所在目录的完整路径,并保存到 PATH_BAT 变量。

第4-11行:设置各种路径变量

定义脚本中需要的所有路径变量,便于维护和修改。

第13行:DEL %OUTPUT%*.bin

删除输出目录下所有 .bin 文件,清理旧文件。

第16行:执行ROM文件打包

调用打包工具,使用批量模式打包所有资源文件。

第19行:执行动画文件打包

调用动画打包工具,处理动画资源。

第21行:@pause

暂停脚本,等待用户按键,方便查看输出结果。

脚本优化版本

如果需要只打包特定资源(如只生成 alarm.bin),可以这样修改:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET PATH_BAT=%~dp0
SET RES_CFG=%PATH_BAT%\..\..\src\inc\cfg\sk_cfg_com.h
SET ROMFILE_SRC=%PATH_BAT%..\..\bin\res\dev\alarm
SET ROMFILE_PACKER=%PATH_BAT%..\bin\windows\romfile_packer\romfile_packer.exe
SET OUTPUT=%PATH_BAT%..\..\bin\res\images\

::只删除 alarm.bin(保留其他文件)
IF EXIST %OUTPUT%alarm.bin DEL %OUTPUT%alarm.bin

::只打包 alarm 目录,不使用 --batch 模式
%ROMFILE_PACKER% -o %OUTPUT%alarm.bin --res-cfg %RES_CFG% %ROMFILE_SRC%

@pause

高级技巧与最佳实践

1. 错误处理

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET TOOL_PATH=C:\tools\my_tool.exe

IF NOT EXIST %TOOL_PATH% (
    echo 错误:找不到工具 %TOOL_PATH%
    pause
    exit /b 1
)

%TOOL_PATH% --param value
IF ERRORLEVEL 1 (
    echo 错误:工具执行失败
    pause
    exit /b 1
)

echo 执行成功!

2. 日志记录

@echo off
SET LOG_FILE=%~dp0build.log

echo [%DATE% %TIME%] 开始执行脚本 >> %LOG_FILE%
echo 正在打包资源...
%ROMFILE_PACKER% --batch %ROMFILE_SRC%
IF ERRORLEVEL 1 (
    echo [%DATE% %TIME%] 打包失败 >> %LOG_FILE%
) ELSE (
    echo [%DATE% %TIME%] 打包成功 >> %LOG_FILE%
)

3. 参数传递

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET MODE=%1
SET OUTPUT_DIR=%2

IF "%MODE%"=="debug" (
    echo 调试模式
    SET LOG_LEVEL=verbose
) ELSE IF "%MODE%"=="release" (
    echo 发布模式
    SET LOG_LEVEL=normal
) ELSE (
    echo 用法: %0 [debug|release] [输出目录]
    exit /b 1
)

echo 输出目录: %OUTPUT_DIR%

4. 函数定义

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

CALL :PACK_RESOURCE alarm
CALL :PACK_RESOURCE menu
CALL :PACK_RESOURCE font

GOTO :EOF

:PACK_RESOURCE
SET RES_NAME=%~1
echo 正在打包 %RES_NAME%...
%ROMFILE_PACKER% -o %OUTPUT%%RES_NAME%.bin %ROMFILE_SRC%\%RES_NAME%
IF ERRORLEVEL 1 (
    echo 打包 %RES_NAME% 失败!
    exit /b 1
)
echo 打包 %RES_NAME% 成功!
GOTO :EOF

5. 环境检查

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: 检查必要的目录是否存在
IF NOT EXIST "%ROMFILE_SRC%" (
    echo 错误:源目录不存在: %ROMFILE_SRC%
    pause
    exit /b 1
)

IF NOT EXIST "%ROMFILE_PACKER%" (
    echo 错误:打包工具不存在: %ROMFILE_PACKER%
    pause
    exit /b 1
)

:: 创建输出目录(如果不存在)
IF NOT EXIST "%OUTPUT%" (
    echo 创建输出目录: %OUTPUT%
    MKDIR "%OUTPUT%"
)

常见问题与解决方案

1. 中文乱码问题

问题: 脚本中的中文显示为乱码

解决方案:

  • 保存脚本时使用 ANSI 编码(GBK)
  • 或在脚本开头添加:chcp 65001(UTF-8)
@echo off
chcp 65001 >nul
echo 中文测试

2. 路径包含空格

问题: 路径包含空格时命令执行失败

解决方案: 用引号包裹路径

SET "OUTPUT=C:\Program Files\output\"
DEL "%OUTPUT%*.bin"

3. 变量值丢失

问题: 在循环中变量值不正确

解决方案: 启用延迟变量扩展

SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%F IN (*.txt) DO (
    SET FILE=%%F
    echo !FILE!  REM 使用 ! 而不是 %
)

4. 权限问题

问题: 脚本无法删除或创建文件

解决方案: 以管理员身份运行脚本

@echo off
NET FILE >nul 2>&1
IF ERRORLEVEL 1 (
    echo 需要管理员权限!
    pause
    exit /b 1
)

5. 路径不存在错误

问题: 访问不存在的路径时报错

解决方案: 先检查路径是否存在

IF NOT EXIST "%OUTPUT%" (
    MKDIR "%OUTPUT%"
)

实用脚本模板

模板1:批量文件处理

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET SRC_DIR=%~dp0source
SET DST_DIR=%~dp0output

IF NOT EXIST "%DST_DIR%" MKDIR "%DST_DIR%"

FOR %%F IN ("%SRC_DIR%\*.txt") DO (
    echo 处理文件: %%F
    COPY "%%F" "%DST_DIR%\"
)

echo 处理完成!
pause

模板2:环境配置脚本

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET PROJECT_ROOT=%~dp0..\..
SET PATH=%PATH%;%PROJECT_ROOT%\tools\bin
SET JAVA_HOME=%PROJECT_ROOT%\tools\jdk

echo 环境配置完成!
echo PROJECT_ROOT=%PROJECT_ROOT%
echo JAVA_HOME=%JAVA_HOME%

pause

模板3:备份脚本

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET SRC_DIR=%~dp0data
SET BACKUP_DIR=%~dp0backup
SET DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%

IF NOT EXIST "%BACKUP_DIR%" MKDIR "%BACKUP_DIR%"

XCOPY "%SRC_DIR%" "%BACKUP_DIR%\%DATE_STR%\" /E /I /Y

echo 备份完成: %BACKUP_DIR%\%DATE_STR%\
pause

总结

批处理脚本是 Windows 下实用的自动化工具。本文涵盖:

  1. 基础语法:注释、变量、命令
  2. 常用命令:SET、ECHO、DEL、IF、FOR
  3. 路径处理:特殊变量、路径操作
  4. 实战案例:资源打包脚本解析
  5. 高级技巧:错误处理、日志记录、函数定义
  6. 常见问题:中文乱码、路径空格、变量丢失等

学习建议

  1. 从简单脚本开始,逐步增加复杂度
  2. 多实践,遇到问题查文档
  3. 使用 echo 调试,查看变量值
  4. 参考优秀脚本,学习最佳实践

推荐资源


如果这篇文章对你有帮助,请点赞、收藏、关注!
如有问题,欢迎在评论区留言讨论!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐