目录
- 批处理基础
- 变量与参数
- 流程控制
- 文件与目录操作
- 网络与系统命令
- 错误处理与调试
- 高级技巧
- 实用脚本模板
- 最佳实践
- 常见问题解答
一、批处理基础1.1 什么是批处理脚本?批处理脚本(Batch Script)是 Windows 系统中用于自动化执行一系列命令的脚本文件,通常以 .bat 或 .cmd 为扩展名。1.2 基本语法结构
- @echo off
- :: 这是一个注释
- REM 这也是一个注释
- title 脚本标题
- color 0a
- echo Hello, World!
- pause
复制代码1.3 常用基础命令
命令 | 说明 | 示例 |
| @echo off | 关闭命令回显 | @echo off |
| echo | 显示文本或变量 | echo Hello |
| pause | 暂停脚本执行 | pause |
| cls | 清屏 | cls |
| title | 设置窗口标题 | title My Script |
| color | 设置颜色 | color 0a (黑底绿字) |
| exit | 退出脚本 | exit |
1.4 颜色代码表:: color 命令格式:color 背景色前景色
:: 颜色代码:
::
0 = 黑色
8 = 灰色
::
1 = 蓝色
9 = 淡蓝色
::
2 = 绿色 A = 淡绿色
::
3 = 浅绿色 B = 淡浅绿色
::
4 = 红色 C = 淡红色
::
5 = 紫色 D = 淡紫色
::
6 = 黄色 E = 淡黄色
::
7 = 白色 F = 亮白色
color
0a :: 黑底绿字
color
4f :: 红底白字
color
17 :: 蓝底白字1.5 第一个批处理脚本@
echo off
title 我的第一个批处理脚本
color 0b
echo ====================================
echo 欢迎使用我的第一个脚本!
echo ====================================
echo.
echo 当前日期:%date%
echo 当前时间:%time%
echo 当前用户:%username%
echo 计算机名:%computername%
echo.
pause
exit
二、变量与参数2.1 变量定义与使用@echo off
setlocal enabledelayedexpansion
:: 定义变量
set name=张三
set age=
25
set city=北京
:: 使用变量
echo 姓名:%name%
echo 年龄:%age%
echo 城市:%city%
:: 延迟变量扩展(在循环中使用)
setcount=
0
for /
l %%i in (
1,
1,
5)
do (
set /
acount+=
1
echo 第!count!次循环
)
endlocal2.2 特殊环境变量@
echo off
echo 系统盘符:%systemdrive%
echo 系统目录:%systemroot%
echo Windows目录:%windir%
echo 临时目录:%temp%
echo 用户配置文件:%userprofile%
echo 当前目录:%
cd%
echo 脚本路径:%~dp0%
echo 脚本完整路径:%~f0%2.3 命令行参数@
echo off
:: %0 = 脚本名称
:: %1-%9 = 第1-9个参数
:: %* = 所有参数
echo 脚本名称:%0
echo 第一个参数:%1
echo 第二个参数:%2
echo 所有参数:%*
:: 检查参数数量
if"%1"==
"" (
echo 用法:script.bat 参数1 参数2
pause
exit /b 1
)
:: 处理带空格的参数
set"param1=%~1"
set"param2=%~2"
echo 处理后的参数1:%param1%
echo 处理后的参数2:%param2%2.4 用户输入@echo off
:: 基本输入
set /p username=请输入用户名:
echo 您输入的用户名是:%username%
:: 密码输入(隐藏显示)
:password_input
set"password="
set /p
password=请输入密码:
if"%password%"==
""goto password_input
:: 数字输入验证
:number_input
set /p
number=请输入一个数字:
set /a
test=%
number%+
02>nul
ifnot"%test%"==
"%number%" (
echo 请输入有效的数字!
goto number_input
)
echo 您输入的数字是:%
number%2.5 数学运算@echo off
set /
aa=
10
set /
ab=
5
:: 基本运算
set /
a sum=%
a%+%
b%
set /
a diff=%
a%-%
b%
set /
a prod=%
a%*%
b%
set /
a quot=%
a%/%
b%
set /
amod=%
a%%%
b%
echo %
a% + %
b% = %sum%
echo %
a% - %
b% = %diff%
echo %
a% * %
b% = %prod%
echo %
a% / %
b% = %quot%
echo %
a% %% %
b% = %
mod%
:: 复合运算
set /
a result=(
10+
5)*
2-
3
echo (
10+
5)*
2-
3 = %result%
:: 位运算
set /
a bitwise=
8|
4
echo8 OR
4 = %bitwise%
三、流程控制3.1 条件语句(IF)@
echo off
:: 基本 IF 语句
if exist
"C:\Windows" (
echo Windows 目录存在
)
else (
echo Windows 目录不存在
)
:: 字符串比较
set str1=hello
set str2=world
if"%str1%"==
"hello"echo 字符串匹配
if /i
"%str1%"==
"HELLO"echo 忽略大小写匹配
:: 数值比较
set num=10
if %num% gtr 5
echo %num% 大于 5
if %num% equ 10
echo %num% 等于 10
if %num% lss 20
echo %num% 小于 20
:: 比较操作符
:: EQU - 等于
:: NEQ - 不等于
:: LSS - 小于
:: LEQ - 小于或等于
:: GTR - 大于
:: GEQ - 大于或等于
:: 错误级别检查
some_command
if errorlevel 1 (
echo 命令执行失败
)3.2 循环语句(FOR)@
echo off
:: 基本 FOR 循环
for %%i
in (1 2 3 4 5)
do (
echo 数字:%%i
)
:: 数值范围循环
for /l %%i
in (1,1,10)
do (
echo 计数:%%i
)
:: 文件循环
for %%f
in (*.txt)
do (
echo 文件:%%f
)
:: 目录循环
for /d %%d
in (*)
do (
echo 目录:%%d
)
:: 递归目录循环
for /r %%f
in (*.
log)
do (
echo 日志文件:%%f
)
:: 字符串分割
set"text=apple,banana,cherry"
for %%i
in (%text%)
do (
echo 水果:%%i
)
:: 命令输出循环
for /f
"tokens=*" %%i
in (
'dir /b')
do (
echo 文件:%%i
)
:: 多列处理
for /f
"tokens=1,2 delims=:" %%a
in (
"name:value")
do (
echo 键:%%a
echo 值:%%b
)3.3 跳转语句(GOTO)@echo off
set choice=
1
if %choice% equ
1goto option1
if %choice% equ
2goto option2
gotoend

ption1
echo 执行选项
1
gotoend

ption2
echo 执行选项
2
gotoend
:
end
echo 脚本结束
pause3.4 菜单系统@echo off
:
menu
cls
echo ====================================
echo 主菜单
echo ====================================
echo1. 系统信息
echo2. 网络诊断
echo3. 文件备份
echo4. 退出
echo ====================================
set /
p choice=请选择选项 (
1-
4):
if"%choice%"==
"1"goto system_info
if"%choice%"==
"2"goto network_diag
if"%choice%"==
"3"goto file_backup
if"%choice%"==
"4"goto exit_script
echo 无效选项,请重新选择!
pause
gotomenu
:system_info
echo 系统信息:
systeminfo | findstr /B /C:
"OS Name" /C:
"OS Version"
pause
gotomenu
:network_diag
echo 网络诊断:
ipconfig /
all
pause
gotomenu
:file_backup
echo 文件备份功能
pause
gotomenu
:exit_script
echo 再见!
exit
四、文件与目录操作4.1 文件操作命令@echo off
:: 创建文件
echo Hello > hello.txt
type nul >
empty.txt
:: 复制文件
copysource.txt destination.txt
xcopy
"C:\source\*""C:\destination\" /
e /h /
y
:: 移动文件
move old.txt
new.txt
:: 删除文件
del temp.txt
del *.tmp
:: 重命名文件
ren oldname.txt newname.txt
:: 检查文件是否存在
if exist
"myfile.txt" (
echo 文件存在
)
else (
echo 文件不存在
)
:: 获取文件信息
for %%
f in (myfile.txt)
do (
echo 文件名:%%~nf
echo 扩展名:%%~xf
echo 完整路径:%%~ff
echo 文件大小:%%~zf 字节
echo 修改日期:%%~
tf
)4.2 目录操作命令@echo off
:: 创建目录
mkdir myfolder
md another_folder
:: 删除目录
rmdir empty_folder
rd /s /q non_empty_folder
:: 切换目录
cd /d
"C:\MyFolder"
:: 列出目录内容
dir
dir /
b :: 简洁列表
dir /s :: 递归列出
dir /
a:d :: 只显示目录
:: 检查目录是否存在
if exist
"myfolder\" (
echo 目录存在
)
:: 获取当前目录
echo 当前目录:%
cd%
:: 遍历子目录
for /d %%d in (*)
do (
echo 子目录:%%d
)4.3 文件内容操作@
echo off
:: 读取文件内容
for /f
"tokens=*" %%i
in (myfile.txt)
do (
echo 行内容:%%i
)
:: 追加内容到文件
echo 新内容 >> myfile.txt
:: 覆盖文件内容
echo 全新内容 > myfile.txt
:: 查找文件内容
findstr
"search_text" myfile.txt
findstr /i
"case_insensitive" myfile.txt
:: 替换文件内容(简单方法)
set"old_text=hello"
set"new_text=world"
for /f
"tokens=*" %%i
in (input.txt)
do (
set"line=%%i"
call
set"line=%%line:%old_text%=%new_text%%%"
echo !line! >> output.txt
)4.4 批量文件处理@
echo off
:: 批量重命名
set count=1
for %%f
in (*.jpg)
do (
ren
"%%f""photo_%count%.jpg"
set /a count+=1
)
:: 批量转换文件编码
for %%f
in (*.txt)
do (
type"%%f" >
"converted_%%f"
)
:: 批量压缩(需要7-zip)
for %%f
in (*.
log)
do (
"C:\Program Files\7-Zip\7z.exe" a
"%%~nf.zip""%%f"
)
:: 批量删除旧文件
forfiles /p
"C:\logs" /s /m *.
log /d -30 /c
"cmd /c del @path"
五、网络与系统命令5.1 网络相关命令@echo off
:: IP配置
ipconfig /all
ipconfig /
release
ipconfig /renew
ipconfig /flushdns
:: 连通性测试
ping -n
4 www.baidu.com
tracert
www.google.com
:: 网络连接
netstat -ano
netstat -an | findstr
":80"
:: DNS查询
nslookup
www.microsoft.com
:: 网络共享
net
share
net
use Z: \\
server\
share
:: WiFi管理
netsh wlan
showprofiles
netsh wlan
connectname=
"MyWiFi"5.2 系统管理命令@echo off
:: 用户管理
net user
net user username password /add
net localgroup administrators username /add
:: 服务管理
net
start
net
stop"ServiceName"
sc
query"ServiceName"
:: 系统信息
systeminfo
wmic os
get Caption,
Version
wmic cpu
getName,NumberOfCores
wmic memorychip
getCapacity
:: 任务管理
tasklist
taskkill /pid
1234 /f
taskkill /im notepad.exe /f
:: 注册表操作
reg
query"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion"
reg
add"HKCU\Software\MyApp" /v
"Setting" /t REG_SZ /d
"Value"5.3 计划任务@echo off
:: 创建计划任务
schtasks /create /
tn"MyTask" /
tr"C:\myscript.bat" /sc daily /
st09:
00
:: 查看计划任务
schtasks /query
:: 删除计划任务
schtasks /
delete /
tn"MyTask" /
f
:: 运行计划任务
schtasks /run /
tn "MyTask"5.4 系统维护脚本@
echo off
title 系统维护工具
color 0a
echo 清理临时文件...
del /q /f /s
"%temp%\*.*"
del /q /f /s
"%systemroot%\temp\*.*"
echo 清理回收站...
rd /s /q %systemdrive%\
$Recycle.bin
echo 清理Windows更新缓存...
net stop wuauserv
del /q /f /s
"%systemroot%\SoftwareDistribution\Download\*.*"
net start wuauserv
echo 优化磁盘...
defrag C: /H /U /V
echo 系统维护完成!
pause
六、错误处理与调试6.1 错误级别处理@echo off
:: 检查错误级别
some_command
if errorlevel
1 (
echo 命令执行失败,错误级别:%errorlevel%
goto error_handler
)
:: 设置自定义错误级别
set ERRORLEVEL=
0
if some_condition (
set ERRORLEVEL=
1
exit /
b1
)
:error_handler
echo 发生错误,正在处理...
pause
exit /
b %ERRORLEVEL%6.2 异常处理@echo off
:: 使用临时文件检测错误
set tempfile=%temp%\error.tmp
del
"%tempfile%"2>nul
some_command >nul
2>
"%tempfile%"
if exist
"%tempfile%" (
echo 命令执行出错
type"%tempfile%"
del
"%tempfile%"
gotocleanup
)
:
cleanup
:: 清理工作6.3 调试技巧@echo off
:: 启用详细输出进行调试
set DEBUG=
1
if defined DEBUG echo [DEBUG] 开始执行脚本
:: 在关键位置添加调试信息
if defined DEBUG echo [DEBUG] 变量值:
name=%
name%
:: 使用日志文件
set LOGFILE=debug.log
echo [%
date% %
time%] 脚本开始 >>
"%LOGFILE%"
:: 条件暂停
if defined DEBUG pause6.4 日志记录@echo off
setLOGFILE=%~n0_%
date:~
0,
4%%
date:~
5,
2%%
date:~
8,
2%.log
:
log
echo [%
date% %
time%] %* >>
"%LOGFILE%"
if defined DEBUG echo [%
date% %
time%] %*
goto :eof
call :
log 脚本开始执行
call :
log 执行用户:%username%
call :
log 计算机名:%computername%
:: 主要逻辑
call :
log 主要操作完成
call :
log 脚本执行结束
七、高级技巧7.1 函数调用@echo off
call :myfunction
"Hello""World"
call :calculate
105
goto :eof
:myfunction
echo 函数参数
1:%~
1
echo 函数参数
2:%~
2
goto :eof
:calculate
set /
a sum=%
1 + %
2
set /
a diff=%
1 - %
2
echo %
1 + %
2 = %sum%
echo %
1 - %
2 = %diff%
goto :eof7.2 数组模拟@echo off
setlocal enabledelayedexpansion
:: 创建数组
set arr[
0]=apple
set arr[
1]=banana
set arr[
2]=cherry
set arr_length=
3
:: 遍历数组
for /l %%i
in (
0,
1,%arr_length%)
do (
if defined arr[%%i] (
echo 元素 %%i: !arr[%%i]!
)
)
:: 动态数组
setcount=
0
for %%f
in (*.txt)
do (
set arr[!
count!]=%%f
set /a
count+=
1
)7.3 字符串操作@echo off
set"text=Hello World"
:: 字符串长度
call :
strlen result
"%text%"
echo 字符串长度:%result%
:: 子字符串
echo 前
5个字符:%tex
t:~
0,
5%
echo 后
5个字符:%tex
t:~-
5%
echo 从第
6个开始:%tex
t:~
6%
:: 字符串替换
set"newtext=%text:Hello=Hi%"
echo 替换后:%newtext%
:: 去除前后空格
set"spaced= Hello "
call :trim trimmed
"%spaced%"
echo 去除空格后:%trimmed%
goto :eof
:
strlen<result_var><string>
setlocal enabledelayedexpansion
set"str=%~2"
set"len=0"
:strlen_loop
if"!str!"==
""goto strlen_done
set"str=!str:~1!"
set /
alen+=
1
goto strlen_loop
:strlen_done
endlocal &
set"%~1=%len%"
goto :eof
:trim
<result_var><string>
setlocal enabledelayedexpansion
set"str=%~2"
:trim_begin
if"!str:~0,1!"==
" "set"str=!str:~1!" &
goto trim_begin
:trim_end
if"!str:~-1!"==
" "set"str=!str:~0,-1!" &
goto trim_end
endlocal &
set"%~1=%str%"
goto :eof7.4 权限提升@
echo off
:: 检查是否以管理员身份运行
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 需要管理员权限
powershell -Command
"Start-Process '%~f0' -Verb RunAs"
exit /b
)
echo 已获得管理员权限
:: 执行需要管理员权限的操作
八、实用脚本模板8.1 备份脚本模板@echo off
title 自动备份脚本
setlocal enabledelayedexpansion
:: 配置
set SOURCE_DIR=C:\ImportantData
set BACKUP_DIR=D:\
Backup
setDATE=%
date:~
0,
4%%
date:~
5,
2%%
date:~
8,
2%
set BACKUP_NAME=backup_%
DATE%
:: 创建备份目录
ifnot exist
"%BACKUP_DIR%" mkdir
"%BACKUP_DIR%"
:: 执行备份
echo 开始备份...
xcopy
"%SOURCE_DIR%""%BACKUP_DIR%\%BACKUP_NAME%\" /e /h /y /c /r
:: 清理旧备份(保留最近7天)
forfiles /p "%BACKUP_DIR%
" /d -7 /c "cmd /c rd /s /q @
path"
echo 备份完成!
pause8.2 日志清理脚本@echo off
title 日志清理工具
color
0c
echo 清理系统日志...
wevtutil
el |
for /
f"tokens=*" %%i in (
'wevtutil el')
do wevtutil
cl"%%i"
echo 清理应用程序日志...
del /q /
f /s
"%appdata%\*.log"
del /q /
f /s
"%localappdata%\*.log"
echo 清理IIS日志...
if exist
"%systemdrive%\inetpub\logs" (
forfiles /
p"%systemdrive%\inetpub\logs" /s /
m *.
log /d -
30 /
c"cmd /c del @path"
)
echo 日志清理完成!
pause8.3 系统信息收集脚本@echo off
title 系统信息收集
set LOGFILE=system_info_%date:~
0,
4%%date:~
5,
2%%date:~
8,
2%.txt
echo 收集系统信息...
echo ==================== >
"%LOGFILE%"
echo 系统信息报告 >>
"%LOGFILE%"
echo 生成时间:%date% %time% >>
"%LOGFILE%"
echo ==================== >>
"%LOGFILE%"
:: 基本信息
echo [基本信息] >>
"%LOGFILE%"
echo 计算机名:%computername% >>
"%LOGFILE%"
echo 用户名:%username% >>
"%LOGFILE%"
echo 域:%userdomain% >>
"%LOGFILE%"
:: 系统版本
echo [系统版本] >>
"%LOGFILE%"
systeminfo | findstr /B /C:
"OS Name" /C:
"OS Version" >>
"%LOGFILE%"
:: 硬件信息
echo [硬件信息] >>
"%LOGFILE%"
wmic cpu
get Name,NumberOfCores,MaxClockSpeed >>
"%LOGFILE%"
wmic memorychip
get Capacity,Speed >>
"%LOGFILE%"
wmic diskdrive
get Model,Size >>
"%LOGFILE%"
:: 网络信息
echo [网络信息] >>
"%LOGFILE%"
ipconfig /
all >>
"%LOGFILE%"
echo 信息收集完成!
echo 日志文件:%LOGFILE%
pause8.4 批量文件重命名脚本@echo off
title 批量文件重命名
setlocal enabledelayedexpansion
set /
p prefix=请输入文件前缀:
set /
p extension=请输入文件扩展名(如:.jpg):
setcount=
1
for %%
f in (*%extension%)
do (
set"newname=%prefix%_!count!%extension%"
ren
"%%f""!newname!"
echo 重命名:%%
f -> !newname!
set /
acount+=
1
)
echo 重命名完成!
pause
九、最佳实践9.1 代码规范@echo off
:: ✅ 好的做法
setlocal enabledelayedexpansion
set "variable=value with spaces"
if exist
"C:\path with spaces\" (
echo Path
exists
)
call :function_name parameter
:: ❌ 避免的做法
set variable=value with spaces
if exist C:\path with spaces\ (
echo Path
exists
)
goto function_name9.2 安全考虑
- 始终验证用户输入
- 避免硬编码敏感信息
- 使用引号包围路径和变量
- 检查文件/目录是否存在再操作
- 限制脚本权限
9.3 性能优化
- 减少不必要的命令调用
- 使用 xcopy 而不是多次 copy
- 避免在循环中调用外部程序
- 使用 findstr 而不是 find 进行复杂搜索
9.4 兼容性考虑
- 使用 %~dp0 获取脚本目录
- 避免使用特定于版本的命令
- 测试不同 Windows 版本
- 考虑 Unicode 和 ANSI 编码问题
十、常见问题解答Q1: 如何让脚本在后台运行?:: 创建 VBS 脚本隐藏运行
echo CreateObject(
"Wscript.Shell").Run
"""" ^& WScript.Arguments(
0) ^&
"""",
0, False >
hide.vbs
cscript //nologo
hide.vbs your_script.bat
del
hide.vbsQ2: 如何处理包含空格的路径?:: 始终使用引号
set "mypath=C:\Program Files\My App"
if exist
"%mypath%" (
echo
Path exists
)Q3: 如何获取脚本所在目录?:: 获取脚本完整路径
echo 脚本路径:%~f0
:: 获取脚本所在目录(带反斜杠)
echo 脚本目录:%~dp0
:: 获取脚本所在目录(不带反斜杠)
set "scriptdir=%~dp0"
set "scriptdir=%scriptdir:~0,-1%"Q4: 如何实现睡眠/延迟?:: 方法1:使用 timeout(推荐)
timeout /t 5 /nobreak >nul
:: 方法2:使用 ping
ping -n 6 127.0.0.1 >nul
:: 方法3:使用 choice(无提示)
choice /c Y /n /d y /t 5 >nulQ5: 如何处理特殊字符?:: 转义特殊字符
echo This
is a care
t: ^^
echo This
is a percen
t: %%
echo This
is an exclamation: ^!
:: 在延迟扩展中处理感叹号
setlocal disabledelayedexpansion
set "text=Hello! World!"
setlocal enabledelayedexpansion
echo !text!
附录:常用命令速查表
类别 | 命令 | 用途 |
| 文件操作 | copy, xcopy, robocopy | 复制文件 |
| move | 移动文件 |
| del, erase | 删除文件 |
| ren, rename | 重命名 |
| 目录操作 | mkdir, md | 创建目录 |
| rmdir, rd | 删除目录 |
| cd, chdir | 切换目录 |
| 系统信息 | systeminfo | 系统详细信息 |
| wmic | Windows管理工具 |
| tasklist, taskkill | 进程管理 |
| 网络 | ipconfig, ping, tracert | 网络诊断 |
| netstat, nslookup | 网络状态 |
| netsh | 网络配置 |
| 用户管理 | net user, net localgroup | 用户组管理 |
| whoami | 当前用户信息 |
| 服务管理 | net start, net stop | 服务控制 |
| sc | 服务配置 |