批处理脚本(Batch Script)是 Windows 系统中用于自动化执行一系列命令的脚本文件,通常以 .bat 或 .cmd 为扩展名。
基本语法结构
@echo off
:: 这是一个注释
REM 这也是一个注释
title 脚本标题
color 0a
echo Hello, World!
pause
常用基础命令
命令 | 说明 | 示例 |
|---|---|---|
@echo off | 关闭命令回显 | @echo off |
echo | 显示文本或变量 | echo Hello |
pause | 暂停脚本执行 | pause |
cls | 清屏 | cls |
title | 设置窗口标题 | title My Script |
color | 设置颜色 | color 0a(黑底绿字) |
exit | 退出脚本 | exit |
@echo off
title 我的第一个批处理脚本
color 0b
echo ====================================
echo 欢迎使用我的第一个脚本!
echo ====================================
echo.
echo 当前日期:%date%
echo 当前时间:%time%
echo 当前用户:%username%
echo 计算机名:%computername%
echo.
pause
exit
颜色代码表
:: 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.变 量定义与使用
@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!次循环
)
endlocal
2.特殊环境变量
@echo off
echo 系统盘符:%systemdrive%
echo 系统目录:%systemroot%
echo Windows目录:%windir%
echo 临时目录:%temp%
echo 用户配置文件:%userprofile%
echo 当前目录:%cd%
echo 脚本路径:%~dp0%
echo 脚本完整路径:%~f0%
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%
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%
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%
流程控制
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 命令执行失败
)
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.跳转语句(GOTO)
@echo off
set choice=1
if %choice% equ 1goto option1
if %choice% equ 2goto option2
gotoend
:option1
echo 执行选项1
gotoend
:option2
echo 执行选项2
gotoend
:end
echo 脚本结束
pause
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
文件与目录操作
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
)
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
)
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.批量文件处理
@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"
网络与系统命令
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"
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"
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"
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
错误处理与调试
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%
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
:: 清理工作
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 pause
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 脚本执行结束
高级技巧
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 :eof
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
)
3.字符串操作
@echo off
set"text=Hello World"
:: 字符串长度
call :strlen result "%text%"
echo 字符串长度:%result%
:: 子字符串
echo 前5个字符:%text:~0,5%
echo 后5个字符:%text:~-5%
echo 从第6个开始:%text:~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 :eof
4.权限提升
@echo off
:: 检查是否以管理员身份运行
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 需要管理员权限
powershell -Command "Start-Process '%~f0' -Verb RunAs"
exit /b
)
echo 已获得管理员权限
:: 执行需要管理员权限的操作
实用脚本模板
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 备份完成!
pause
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 日志清理完成!
pause
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%
pause
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
最佳实践
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_name
2.安全考虑
✅始终验证用户输入
✅避免硬编码敏感信息
✅使用引号包围路径和变量
✅检查文件/目录是否存在再操作
✅限制脚本权限
3.性能优化
✅减少不必要的命令调用
✅使用 xcopy 而不是多次 copy
✅避免在循环中调用外部程序
✅使用 findstr 而不是 find 进行复杂搜索
4.兼容性考虑
✅使用 %~dp0 获取脚本目录
✅避免使用特定于版本的命令
✅测试不同 Windows 版本
✅考虑 Unicode 和 ANSI 编码问题
常见问题
1.如何让脚本在后台运行
:: 创建 VBS 脚本隐藏运行
echo CreateObject("Wscript.Shell").Run """" ^& WScript.Arguments(0) ^& """", 0, False > hide.vbs
cscript //nologo hide.vbs your_script.bat
del hide.vbs
2.如何处理包含空格的路径
:: 始终使用引号
set "mypath=C:\Program Files\My App"
if exist "%mypath%" (
echo Path exists
)
3.如何获取脚本所在目录
:: 获取脚本完整路径
echo 脚本路径:%~f0
:: 获取脚本所在目录(带反斜杠)
echo 脚本目录:%~dp0
:: 获取脚本所在目录(不带反斜杠)
set "scriptdir=%~dp0"
set "scriptdir=%scriptdir:~0,-1%"
4.如何实现睡眠/延迟
:: 方法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 >nul
5.如何处理特殊字符
:: 转义特殊字符
echo This is a caret: ^^
echo This is a percent: %%
echo This is an exclamation: ^!
:: 在延迟扩展中处理感叹号
setlocal disabledelayedexpansion
set "text=Hello! World!"
setlocal enabledelayedexpansion
echo !text!
常用命令速查表
THE END


















暂无评论内容