Windows批处理脚本(.bat)完全指南:从入门到实战
批处理脚本(Batch Script)是 Windows 下的自动化脚本,扩展名为.bat或.cmd。它可批量执行命令,常用于自动化任务、资源打包、环境配置等。@echo offGOTO :EOFecho 正在打包 %RES_NAME%...echo 打包 %RES_NAME% 失败!exit /b 1echo 打包 %RES_NAME% 成功!GOTO :EOF批处理脚本是 Windows 下实
Windows批处理脚本(.bat)完全指南:从入门到实战
目录
什么是批处理脚本
批处理脚本(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 下实用的自动化工具。本文涵盖:
- 基础语法:注释、变量、命令
- 常用命令:SET、ECHO、DEL、IF、FOR
- 路径处理:特殊变量、路径操作
- 实战案例:资源打包脚本解析
- 高级技巧:错误处理、日志记录、函数定义
- 常见问题:中文乱码、路径空格、变量丢失等
学习建议
- 从简单脚本开始,逐步增加复杂度
- 多实践,遇到问题查文档
- 使用
echo调试,查看变量值 - 参考优秀脚本,学习最佳实践
推荐资源
如果这篇文章对你有帮助,请点赞、收藏、关注!
如有问题,欢迎在评论区留言讨论!
更多推荐


所有评论(0)