由于对接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