Windows 批处理脚本(.bat / .cmd)编写终极指南

批处理脚本(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
如果觉得这篇文章对您有帮助,可以收藏本网址,方便下次访问!
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容