Windows批处理脚本入门与实战技巧

Windows批处理脚本入门与实战技巧 1. DOS批处理文件基础入门在Windows系统中DOS批处理文件.bat或.cmd是一种强大的自动化工具它允许我们将一系列命令写入文本文件后批量执行。这种看似简单的技术在实际工作中能大幅提升效率。我至今记得第一次用批处理完成100台服务器日志收集时的震撼——原本需要3天的手工操作一个批处理脚本20分钟就搞定了。批处理文件本质上就是纯文本文件但扩展名必须是.bat或.cmd。当双击运行或通过命令行调用时系统会启动cmd.exe逐行执行其中的命令。这种特性使其特别适合处理重复性任务比如批量重命名/移动文件自动化软件安装配置定期系统维护清理多步骤开发环境搭建1.1 创建你的第一个批处理文件打开记事本输入以下内容echo off echo 正在初始化系统清理... del /q/f/s %temp%\*.* echo 临时文件清理完成 pause保存为clean_temp.bat后双击运行。这个简单脚本会关闭命令回显echo off显示操作提示信息强制删除临时文件夹所有内容显示完成提示并暂停警告del命令使用/f强制删除只读文件/q静默模式不确认实际使用前建议先在测试环境验证1.2 核心元命令详解批处理中有几个必须掌握的元命令echoecho on/off控制是否显示正在执行的命令echo 信息输出指定内容到屏幕前加符号表示不显示该行命令本身rem注释说明不会被执行良好的注释习惯能让你半年后还能看懂脚本逻辑pause暂停执行并显示按任意键继续关键操作前建议添加防止误操作title设置命令窗口标题例如title 数据库备份进程2. 批处理编程进阶技巧2.1 变量操作艺术批处理中变量分为两种系统环境变量%PATH%、%TEMP%等用户自定义变量set varvalue变量设置与引用set server_ip192.168.1.100 echo 正在连接 %server_ip%... ping %server_ip%交互式输入set /p username请输入用户名 echo 您输入的用户名是%username%日期时间变量set today%date:~0,4%-%date:~5,2%-%date:~8,2% echo 今天是%today%2.2 流程控制实战条件判断ifif exist C:\logs ( echo 日志目录存在 ) else ( mkdir C:\logs echo 已创建日志目录 )错误级别判断copy important.txt D:\backup\ if errorlevel 1 ( echo 备份失败请检查磁盘空间 exit /b 1 )多条件选择choice /c:yn /m 确认要执行此操作吗 if errorlevel 2 goto cancel if errorlevel 1 goto confirm :confirm echo 您选择了是 goto end :cancel echo 操作已取消 goto end2.3 循环处理大师for循环经典用法:: 遍历当前目录txt文件 for %%f in (*.txt) do ( echo 正在处理%%f type %%f combined.txt ) :: 读取文件内容逐行处理 for /f tokens* %%l in (servers.list) do ( ping %%l -n 2 )数字序列循环:: 创建5个测试目录 for /l %%i in (1,1,5) do mkdir test%%i解析命令输出:: 获取Java进程列表 for /f tokens1-2 %%a in (tasklist ^| findstr java) do ( echo 发现Java进程%%a PID%%b )3. 高级批处理技术3.1 函数封装技巧虽然批处理没有真正的函数但可以通过标签和参数模拟:: 调用示例call :log 警告信息 red :log set msg%~1 set color%~2 if %color%red ( echo [ERROR] %msg% ) else ( echo [INFO] %msg% ) goto :eof3.2 错误处理机制自动重试机制set max_retry3 set retry0 :retry_copy xcopy source dest /y if %errorlevel% neq 0 ( set /a retry1 if %retry% lss %max_retry% ( echo 第%retry%次尝试失败10秒后重试... ping 127.0.0.1 -n 10 nul goto retry_copy ) else ( echo 错误超过最大重试次数 exit /b 1 ) )日志记录系统call :log_init call :log 脚本开始执行 :log_init set logfile%date:/%-%time::-%.log set logfile%logfile: 0% echo 日志开始 %logfile% goto :eof :log echo %date% %time% %* %logfile% goto :eof3.3 注册表操作读取注册表for /f tokens2* %%a in (reg query HKLM\SOFTWARE\JavaSoft /v CurrentVersion 2^nul) do ( set java_ver%%b )写入注册表reg add HKCU\Software\MyApp /v InstallPath /t REG_SZ /d %cd% /f4. 实用批处理案例集4.1 自动化备份脚本echo off set backup_dirD:\backup\%date:~0,4%%date:~5,2%%date:~8,2% set db_nameproduction_db :: 创建备份目录 if not exist %backup_dir% mkdir %backup_dir% :: MySQL备份 mysqldump -uroot -p123456 %db_name% %backup_dir%\%db_name%.sql :: 压缩备份文件 C:\Program Files\7-Zip\7z.exe a -tzip %backup_dir%\db_backup.zip %backup_dir%\*.sql :: 删除临时SQL文件 del %backup_dir%\*.sql :: 保留最近7天备份 forfiles /p %backup_dir% /s /m *.zip /d -7 /c cmd /c del path4.2 批量文件重命名工具echo off setlocal enabledelayedexpansion set counter1 for %%f in (*.jpg) do ( set newnamephoto_!counter!.jpg ren %%f !newname! set /a counter1 echo 已重命名%%f → !newname! )4.3 系统监控告警脚本:: 监控CPU使用率超过90%时发邮件告警 :loop for /f tokens2 delims %%a in (wmic cpu get loadpercentage /value) do ( set cpu_load%%a ) if %cpu_load% gtr 90 ( echo CPU负载过高%cpu_load%%% | blat - -t admincompany.com -s CPU告警 ) timeout /t 60 nul goto loop5. 排错与优化指南5.1 常见错误代码错误码含义解决方案9009程序不是可执行文件检查路径或安装对应程序2系统找不到指定文件确认文件路径是否正确5拒绝访问以管理员身份运行50不支持网络请求检查网络共享权限5.2 调试技巧启用回显echo on rem 这里开始显示执行的每条命令逐行调试pause echo 第一步完成 pause dir pause日志输出echo [%time%] 开始处理 debug.log dir C:\ debug.log 21 echo [%time%] 处理完成 debug.log5.3 性能优化建议减少磁盘IO合并多个命令避免频繁读写使用延迟变量复杂循环中使用setlocal enabledelayedexpansion避免重复计算将频繁使用的值存入变量合理使用临时文件大文本处理时比内存操作更高效:: 优化前每次循环都调用time for /l %%i in (1,1,100) do echo %time% log.txt :: 优化后只获取一次时间 set start_time%time% for /l %%i in (1,1,100) do echo !start_time! log.txt6. 批处理与其他技术的结合6.1 调用PowerShell:: 执行PowerShell命令 powershell -command Get-Service | Where-Object {$_.Status -eq Running} :: 运行PS脚本并获取返回值 for /f delims %%i in (powershell -file script.ps1) do set result%%i6.2 结合VBScript:: 弹出消息框 echo MsgBox 操作已完成, vbInformation, 提示 msg.vbs start msg.vbs6.3 集成Python脚本:: 执行Python并传参 set input_datatest for /f delims %%i in (python process.py %input_data%) do set output%%i6.4 计划任务自动化:: 创建每天3点运行的计划任务 schtasks /create /tn 每日备份 /tr C:\scripts\backup.bat /sc daily /st 03:007. 安全最佳实践敏感信息处理不要在脚本中硬编码密码使用系统环境变量存储凭据设置适当文件权限icacls输入验证if %~1 ( echo 用法%0 文件名 exit /b 1 )日志审计echo [%date% %time%] 用户 %username% 执行了 %0 %* audit.log代码签名使用signtool)signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com script.bat8. 现代替代方案参考虽然批处理仍然实用但现代需求可能需要更强大的工具PowerShell微软新一代脚本语言面向对象更强大Python跨平台丰富的库支持AutoHotkey专业GUI自动化工具Jenkins专业的持续集成工具迁移建议简单文件操作保持批处理复杂逻辑转用PowerShell/Python需要跨平台使用Python最后分享一个实用技巧在批处理开头添加chcp 65001可以支持UTF-8编码避免中文乱码问题。我在处理多语言环境时这个命令解决了大问题。