Windows 批处理脚本(Batch Script)编写手册


目录

  1. 简介
  2. 基本语法
  3. 常用命令
  4. 变量与参数
  5. 流程控制
  6. 注释与可读性
  7. 错误处理
  8. 最佳实践
  9. 示例脚本
  10. 参考资源

简介

批处理脚本(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 重命名完成。

参考资源


📝 提示:对于复杂任务,建议使用 PowerShell 替代批处理脚本,功能更强大且更安全。