如何使用Windows批处理检测文件变更并实现通知?
用Windows批处理实现文件变更监控(无需额外软件)
可以实现,核心思路是通过循环检测目标文件的修改时间和文件大小,与基准值对比,当任意一项发生变化时触发通知。以下是可直接使用的批处理脚本:
@echo off setlocal enabledelayedexpansion :: 配置监控参数 set "MONITOR_FILE=C:\your\file\path\target.txt" :: 替换为你的目标文件路径 set "CHECK_INTERVAL=5" :: 检测间隔(秒) :: 初始化基准信息 for %%f in ("%MONITOR_FILE%") do ( set "LAST_MODIFY=%%~tf" set "LAST_SIZE=%%~zf" ) echo 已启动文件监控:%MONITOR_FILE% echo 初始基准:修改时间[%LAST_MODIFY%] | 文件大小[%LAST_SIZE%]字节 echo. :DETECT_LOOP :: 等待指定间隔 timeout /t %CHECK_INTERVAL% /nobreak >nul 2>&1 :: 获取当前文件状态 for %%f in ("%MONITOR_FILE%") do ( set "CURRENT_MODIFY=%%~tf" set "CURRENT_SIZE=%%~zf" ) :: 对比状态,触发变更通知 if not "!CURRENT_MODIFY!"=="!LAST_MODIFY!" goto ON_CHANGE if not "!CURRENT_SIZE!"=="!LAST_SIZE!" goto ON_CHANGE goto DETECT_LOOP :ON_CHANGE echo ============================================== echo 【文件变更通知】%date% %time% echo 目标文件:%MONITOR_FILE% echo 原修改时间:%LAST_MODIFY% → 新修改时间:!CURRENT_MODIFY! echo 原文件大小:%LAST_SIZE%字节 → 新文件大小:!CURRENT_SIZE!字节 echo ============================================== :: 弹出系统消息框(可选) msg * "文件 %MONITOR_FILE% 已发生变更!" :: 更新基准状态,继续监控 set "LAST_MODIFY=!CURRENT_MODIFY!" set "LAST_SIZE=!CURRENT_SIZE!" goto DETECT_LOOP
关键说明
- 延迟变量扩展:
setlocal enabledelayedexpansion是必须的,确保循环内的变量能实时更新 - 状态检测:
%%~tf提取文件修改时间,%%~zf提取文件大小,双重检测可减少误判 - 通知方式:除了控制台输出,
msg *会给所有登录用户弹出Windows消息框;如果只需要控制台提示,可删除该行 - 间隔调整:修改
CHECK_INTERVAL的值可调整检测频率,建议设为3-10秒,避免占用过多CPU
局限性
- 无法识别“修改内容后文件大小和时间未变”的极端场景(几乎不会遇到)
- 如果目标文件被删除后重建,脚本会报错;可在循环前添加
if not exist "%MONITOR_FILE%"的判断逻辑自行优化
内容的提问来源于stack exchange,提问作者Michael Hutter
相关产品推荐
相关产品推荐

