一、批处理脚本概述
定义
批处理脚本是一种基于命令行的自动化脚本语言,通过.bat或.cmd文件保存,由Windows系统的cmd.exe解释器执行。
核心作用
自动化重复性任务(如文件操作、系统配置)
批量处理文件(搜索、复制、删除)
集成命令行工具(如ping、netstat)
简单的系统管理(服务控制、注册表操作)
执行环境
原生支持:Windows CMD.EXE
PowerShell兼容:可通过&或call调用PowerShell命令
跨平台扩展:WSL(Windows Subsystem for Linux)中可运行Linux命令
二、批处理基础语法
脚本结构
batch
:: 注释(以::开头或#开头)
@echo off :: 关闭命令回显
[label] :: 标签(用于跳转)
command :: 执行命令
goto label :: 跳转到标签
exit /b [code] :: 退出脚本(可选返回码)
命令分隔符
&:顺序执行多个命令
batch
dir & echo 完成
||:条件执行(前命令失败则执行后命令)
batch
net start service || echo 服务启动失败
&&:条件执行(前命令成功则执行后命令)
batch
dir file.txt && type file.txt
三、常用内置命令
命令 功能 示例
dir 列出目录内容 dir /s /a(递归显示所有文件)
cd/chdir 切换目录 cd C:\Users
copy 复制文件 copy src.txt dest.txt
del/erase 删除文件 del .tmp(删除临时文件)
move 移动或重命名文件 move old.txt new.txt
type 显示文件内容 type log.txt
findstr 文本搜索 findstr “error” log.txt
ping 测试网络连通性 ping www.baidu.com
tasklist 显示进程列表 `tasklist
shutdown 关机/重启 shutdown /s /t 60(60秒后关机)
四、变量与运算
变量声明
batch
setlocal enabledelayedexpansion :: 启用延迟变量扩展
set VAR=value :: 定义局部变量
setx VAR=value /M :: 定义环境变量(全局生效)
特殊变量
%~1:第一个参数
%ERRORLEVEL%:上一条命令的返回码
%DATE%/%TIME%:当前日期时间
%%VAR%%:在循环中引用变量(延迟扩展需!VAR!)
算术运算
batch
set /a C=A+B :: 加法
set /a D=A-5 :: 减法
set /a E=A10 :: 乘法
set /a F=A/3 :: 整数除法
五、条件判断与循环
if语句
batch
if %VAR% == value (
command1
) else (
command2
)
for循环
batch
for %%F in (.txt) do (
echo 处理文件:%%F
)
支持通配符/?和范围遍历(如1 2 3)
while循环
batch
:loop
command
if condition (
goto loop
)
六、高级技巧
错误处理
batch
if %ERRORLEVEL% neq 0 (
echo 错误:%ERRORLEVEL%
exit /b 1
)
日志记录
batch
command >> log.txt :: 追加输出到日志
command 2>&1 >> log.txt :: 捕获错误流并记录
参数传递
batch
:: 脚本内接收参数
set ARGS=%*
echo 参数:%ARGS%
调用外部程序
batch
call python script.py :: 调用Python脚本
七、批处理 vs PowerShell
特性 批处理脚本 PowerShell
语法简洁性 依赖CMD命令 基于.NET对象模型
跨平台支持 仅Windows 支持Windows/Linux/macOS
复杂操作能力 有限 强大(正则表达式、管道操作)
学习曲线 低(适合快速脚本) 较高(需熟悉PowerShell语法)
八、注意事项
路径问题
使用绝对路径避免歧义(如C:\path\to\file)
工具路径未添加时需指定完整路径(如C:\Python39\python.exe script.py)
权限问题
部分操作需管理员权限(如修改注册表、启动服务)
测试与调试
逐行测试:echo command查看实际执行的命令
使用pause暂停执行检查中间状态
九、示例脚本
场景:批量重命名PDF文件(添加日期前缀)
batch
@echo off
setlocal enabledelayedexpansion
set DATE=%date:10,4%%date:4,2%%date:~7,2%
for %%F in (*.pdf) do (
set NEWNAME=!DATE!_%%F
ren “%%F” “!NEWNAME!”
)
echo 重命名完成!