Windows批处理定时检查文件大小并异常发邮件及脚本错误排查
解决批处理脚本错误并实现完整需求方案
一、修复原脚本的"else was unexpected"错误
原脚本的核心问题有两个:
- 变量赋值时引号嵌套错误:
set "file="C:\CodeBases\DumpStack.log"多了一个双引号,正确写法是set "file=C:\CodeBases\DumpStack.log" - 未处理文件不存在的场景:如果目标文件不存在,
size变量会未定义,直接触发if语句语法错误
修正后的基础检查脚本:
@echo off setlocal enabledelayedexpansion set "file=C:\CodeBases\DumpStack.log" set MAXBYTESIZE=500000 :: 检查文件是否存在 if not exist "%file%" ( echo 错误:文件 %file% 不存在 pause exit /b 1 ) :: 获取文件大小 for %%A in ("%file%") do set /a size=%%~zA :: 按需求判断:小于500KB则告警(原逻辑相反) if !size! LSS !MAXBYTESIZE! ( echo 告警:%file% 大小仅为 !size! 字节,小于500KB ) else ( echo %file% 大小为 !size! 字节,符合要求 ) pause endlocal
二、扩展实现完整需求
1. 支持接收文件名参数
脚本可通过命令行传入目标文件路径,比如运行checkfile.bat "C:\test\data.json"
2. 实现每30分钟自动检查
结合timeout命令实现循环等待,或使用Windows任务计划程序(更稳定)
3. 发送告警邮件到指定邮箱
采用PowerShell内置命令发送邮件,无需额外安装工具
完整脚本如下:
@echo off setlocal enabledelayedexpansion :: 检查是否传入文件名参数 if "%~1"=="" ( echo 错误:请传入要检查的文件路径作为参数 echo 示例:%~nx0 "C:\path\to\your\file.json" pause exit /b 1 ) set "file=%~1" set MAXBYTESIZE=500000 set ALERT_EMAIL=abc@gmail.com set CHECK_INTERVAL=1800 :: 30分钟=1800秒 :CHECK_LOOP :: 检查文件是否存在 if not exist "!file!" ( echo [!date! !time!] 错误:文件 !file! 不存在 goto WAIT_NEXT_CHECK ) :: 获取文件大小 for %%A in ("!file!") do set /a size=%%~zA :: 判断是否需要发送告警 if !size! LSS !MAXBYTESIZE! ( echo [!date! !time!] 告警:!file! 大小为 !size! 字节,小于500KB,正在发送邮件... :: PowerShell发送邮件(Gmail需开启两步验证并使用应用专用密码) powershell -Command "Send-MailMessage -To '!ALERT_EMAIL!' -From 'alert@yourdomain.com' -Subject '文件大小告警' -Body '文件:!file! 当前大小:!size! 字节,低于阈值500KB' -SmtpServer 'smtp.gmail.com' -Port 587 -UseSsl -Credential (New-Object System.Management.Automation.PSCredential('your-gmail-account@gmail.com', (ConvertTo-SecureString 'your-app-password' -AsPlainText -Force)))" ) else ( echo [!date! !time!] !file! 大小为 !size! 字节,符合要求 ) :WAIT_NEXT_CHECK echo 等待30分钟后再次检查... timeout /t !CHECK_INTERVAL! /nobreak >nul goto CHECK_LOOP endlocal
关键说明
- Gmail邮件配置:需开启账号两步验证,创建「应用专用密码」替代原密码使用,确保SMTP服务正常连接
- 定时方案推荐:若需长期稳定运行,优先使用Windows任务计划程序,设置每30分钟执行一次脚本并传入文件参数,避免脚本挂起中断
- 变量延迟扩展:启用
setlocal enabledelayedexpansion并使用!变量!语法,避免循环中变量解析异常
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

