由於對接zabbix監控的需要,需要判斷指定文件內容是否發生變化,約定:返回1表示文件發生變化,返回0表示文件沒有發生變化。bat/cmd 批處理腳步實現原理如下:
- 讀取生成的md5文件內容,得到舊的md5校驗碼,文件爲空則校驗碼也爲空;
- 調用certutil計算指定文件的md5校驗碼,並保存到md5文件
- 讀取md5文件內容,得到新的md5校驗碼,並判斷:兩個校驗碼都不爲空並且兩者不等則返回1,否則返回0,具體事項如下:
1、file_changed.bat
@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
2、用法如下
// 判斷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