Windows 批处理脚本(Batch Script)编写手册
目录
简介
批处理脚本(Batch File)是 Windows 系统中一种使用 .bat 或 .cmd 扩展名的脚本文件,由一系列命令行命令组成,用于自动化重复性任务。它由 Windows 命令解释器(cmd.exe)执行。
基本语法
- 文件扩展名:
.bat或.cmd - 每行一条命令(长命令可使用
^换行) - 不区分大小写(但建议统一风格)
- 使用
@echo off关闭命令回显(推荐放在脚本开头)
@echo off
echo Hello, World!
pause
常用命令
| 命令 | 说明 |
|---|---|
echo | 显示文本或开关命令回显 |
set | 设置/显示环境变量 |
if | 条件判断 |
for | 循环结构 |
goto | 跳转到标签 |
call | 调用另一个批处理文件或子程序 |
start | 启动程序或窗口 |
copy, move, del, mkdir, rmdir | 文件/目录操作 |
exit | 退出脚本或 cmd |
pause | 暂停并等待用户按键 |
变量与参数
环境变量
set MY_VAR=Hello
echo %MY_VAR%
命令行参数
%0:脚本自身名称%1到%9:前9个参数%*:所有参数- 使用
shift可访问第10个及以上参数
@echo off
echo 脚本名:%0
echo 第一个参数:%1
echo 所有参数:%*
延迟变量扩展(重要!)
在 if 或 for 块中,使用 !var! 代替 %var% 获取实时值(需启用):
@echo off
setlocal enabledelayedexpansion
set count=0
for %%i in (a b c) do (
set /a count+=1
echo 当前计数:!count!
)
流程 控制
条件判断
if exist "C:\test.txt" (
echo 文件存在
) else (
echo 文件不存在
)
if "%1"=="install" (
call :install
)
循环
for %%f in (*.txt) do echo %%f
for /L %%i in (1,1,5) do echo %%i
子程序(类似函数)
call :myfunc arg1 arg2
goto :eof
:myfunc
echo 参数1:%1,参数2:%2
goto :eof
注释与可读性
- 使用
REM或::添加注释 - 建议使用
::(更高效)
:: 这是一个注释
REM 这也是一个注释
- 保持缩进和空行提高可读性
错误处理
- 检查
%ERRORLEVEL%(上一条命令的返回码) - 0 表示成功,非0表示错误
copy file.txt dest\
if %ERRORLEVEL% neq 0 (
echo 复制失败!
exit /b 1
)
最佳实践
✅ 推荐做法:
- 脚本开头使用
@echo off - 使用
setlocal避免污染全局环境 - 路径用双引号包裹(防止空格问题)
- 使用延迟扩展处理动态变量
- 添加错误检查和日志输出
- 保持脚本简洁,复杂逻辑考虑 PowerShell
❌ 避免:
- 硬编码路径(尽量使用相对路径或参数)
- 过度使用
goto(降低可读性) - 忽略错误处理
示例脚本
示例1:备份指定目录
@echo off
setlocal
set SOURCE=C:\MyData
set DEST=D:\Backup\%date:~0,4%-%date:~5,2%-%date:~8,2%
if not exist "%DEST%" mkdir "%DEST%"
robocopy "%SOURCE%" "%DEST%" /E /Z /R:3 /W:5
if %ERRORLEVEL% leq 1 (
echo 备份成功!
) else (
echo 备份失败!
)
pause
示例2:批量重命名
@echo off
setlocal enabledelayedexpansion
set i=1
for %%f in (*.jpg) do (
ren "%%f" "photo_!i!.jpg"
set /a i+=1
)
echo 重命名完成。
参考资源
- Microsoft 官方 CMD 文档
- SS64 Batch 脚本参考
- 《Windows 命令行详解》(书籍)
📝 提示:对于复杂任务,建议使用 PowerShell 替代批处理脚本,功能更强大且更安全。