如何编写监测源文件夹变更自动复制文件并重启服务的批处理程序
Windows Batch 实现文件夹变更自动同步+指定服务重启
不用安装第三方工具,靠Windows系统自带命令就能实现,稳定性比手写循环扫文件的方案好很多。
实现逻辑
- 用系统自带
robocopy工具的原生监测能力识别文件新增、修改事件,不用手写逻辑对比文件修改时间/哈希,资源占用低 - 检测到变更后自动增量同步文件到目标目录,只传输有变动的文件,同步速度快
- 同步完成后自动重启指定服务,既避免文件被服务进程占用导致同步失败,也能保证服务加载到最新的文件
可直接使用的批处理代码
把下面代码存成.bat后缀的文件,修改完开头的配置项就能直接运行:
@echo off chcp 65001 >nul :: ========== 以下配置项按自己实际情况修改 ========== :: 要监测的源文件夹路径 set "SOURCE_DIR=C:\your\source\folder" :: 同步的目标文件夹路径 set "TARGET_DIR=D:\your\target\folder" :: 要重启的服务的服务名(注意不是服务显示名) set "SERVICE_NAME=YourServiceName" :: 兜底监测间隔,单位分钟,填1即可 set "CHECK_INTERVAL=1" :: ============================================== :: 启动时先执行一次全量同步 echo 启动初始全量同步... robocopy "%SOURCE_DIR%" "%TARGET_DIR%" /E /COPY:DAT /R:3 /W:2 /NFL /NDL /NJH /NJS echo 初始同步完成,已进入文件夹监测状态。 :loop :: /MON:1 代表检测到至少1个文件变更就触发同步,/MOT为兜底轮询间隔 robocopy "%SOURCE_DIR%" "%TARGET_DIR%" /E /COPY:DAT /R:3 /W:2 /MON:1 /MOT:%CHECK_INTERVAL% /NFL /NDL /NJH /NJS echo 检测到文件变更,同步完成,正在重启服务... :: 停止服务,等待2秒给进程释放文件占用 net stop "%SERVICE_NAME%" timeout /t 2 /nobreak >nul :: 启动服务 net start "%SERVICE_NAME%" echo 服务重启完成,继续监测。 goto loop
使用踩坑提示
- 服务名一定不要填服务管理器里显示的中文名称,要双击对应服务,在弹出的属性窗口里复制「服务名称」栏的内容填进去,否则启停服务的指令会执行失败
- 运行批处理的时候右键选择「以管理员身份运行」,否则会因为权限不足没法操作系统服务、读写受限目录
- 如果需要同步文件夹权限、所有者信息,把代码里的
/COPY:DAT换成/COPYALL就行;如果不需要递归同步子文件夹,把/E参数删掉 - 有不需要同步的文件类型,就在robocopy那行最后加参数,比如
/XF *.tmp *.bak就会过滤掉临时文件、备份文件 - 如果服务停止速度慢,把
timeout /t 2里的数字改大,比如改成5,等服务完全退出再启动,避免启动报错 - 要开机自动运行的话,给这个bat文件建个快捷方式,扔到
shell:startup打开的启动文件夹里,记得把快捷方式属性设置为以管理员身份运行
内容的提问来源于stack exchange,提问作者Ayan Khan
相关产品推荐
相关产品推荐

