找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 系统 软件 工具
广告位招租中
广告位招租中
广告位招租中
广告位招租中
广告位招租中
广告位招租中
查看: 4|回复: 0

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

[复制链接]

4

主题

0

回帖

20

积分

管理员

积分
20

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉VIP论坛元老

发表于 昨天 18:42 | 显示全部楼层 |阅读模式

目录
  • 批处理基础
  • 变量与参数
  • 流程控制
  • 文件与目录操作
  • 网络与系统命令
  • 错误处理与调试
  • 高级技巧
  • 实用脚本模板
  • 最佳实践
  • 常见问题解答

一、批处理基础1.1 什么是批处理脚本?批处理脚本(Batch Script)是 Windows 系统中用于自动化执行一系列命令的脚本文件,通常以 .bat 或 .cmd 为扩展名。1.2 基本语法结构
  1. @echo off
  2. :: 这是一个注释
  3. REM 这也是一个注释
  4. title 脚本标题
  5. color 0a
  6. echo Hello, World!
  7. 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%

:: 子字符串
echo5个字符:%text:~0,5%
echo5个字符:%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 :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 备份完成!
pause
8.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 caret: ^^
echo This is a percent: %%
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系统详细信息
wmicWindows管理工具
tasklist, taskkill进程管理
网络ipconfig, ping, tracert网络诊断
netstat, nslookup网络状态
netsh网络配置
用户管理net user, net localgroup用户组管理
whoami当前用户信息
服务管理net start, net stop服务控制
sc服务配置


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|亿维无盘技术交流中心 ( 蜀ICP备2025166094号-1 )

GMT+8, 2026-3-11 05:49 , Processed in 0.072038 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表