由于对接zabbix监控的需要,需要判断指定文件内容是否发生变化,约定:返回1表示文件发生变化,返回0表示文件没有发生变化。bat/cmd 批处理脚步实现原理如下:
- @echo off & setlocal
-
- rem 参数去引号处理
- set arg1=%~1
- set arg2=%~2
-
- rem arg1文件路径不能为空
- if "%arg1%"=="" goto usage
- if not exist %arg1% goto usage
-
- rem arg2 md5临时文件名,为空默认为文件名.md5
- if "%arg2%"=="" set arg2=%arg1%
-
- rem 先读取旧的md5值
- if exist %arg2%.md5 (set /p md5_old=<%arg2%.md5)
-
- rem 计算文件md5值,保存到md5文件
- certutil -hashfile %arg1% MD5 | find /v ":" > %arg2%.md5
-
- rem 读取新的md5值
- set /p md5=<%arg2%.md5
- set flag=0
-
- rem 比较md5值是否变化,判断文件是否发生变化
- if defined md5_old (
- if not "%md5_old%" == "%md5%" ( set flag=1 )
- )
-
- rem 输出1文件发生变化,0文件没发生变化
- echo %flag%
- exit /b 0
-
- :usage
- echo %0 filepath [md5name]
- exit /b 1
-
- // 判断md5_tst.txt文件是否发生变化,第一次返回0,没变化
- D:\bat_cmd>file_changed.bat md5_tst.txt
- 0
-
- // 修改md5_tst.txt,再执行脚步,返回1,内容发生变化
- D:\bat_cmd>file_changed.bat md5_tst.txt
- 1
-
- // 再次执行脚本,返回0,内容相对上次没发生变化
- D:\bat_cmd>file_changed.bat md5_tst.txt
- 0
-