user2733501
user2733501

Reputation: 31

Find out if file's modified date is older than N hours in Batch file and send email if not

I thought this post was exactly what I was looking for:

Find out if file is older than 4 hours in Batch file

However, it doesn't seem to work. Can anyone help?

I have an aplication running on many servers that crashes every once and a while. When it crashes, it no longer writes to its own log file. Therefor, if I can write a bat file to check if that log file has not been modified recently, it can email me an alert. Unfortunately, I need to know if this file has been changed within the last 4 to 5 hours. Knowing if the file was modified within the last day is not good enough. Thanks!

Upvotes: 2

Views: 1890

Answers (1)

Endoro
Endoro

Reputation: 37589

try this, explanation is in the code:

@ECHO OFF &SETLOCAL
:: Initialisation
CALL :GetInternational

:: Example
SET "date1=Fr 08/30/2013"
SET "time1=19:50:52,17"

:: Get the seconds
call :GetSecs "%date1%" "%time1%" sec1
call :GetSecs "%date%" "%time%" sec2

:: calculate the minutes
set /a elapsedMin="(sec2-sec1)/60"
echo This answer is %elapsedMin% minute(s) old (CET).

:: calculate the hours
:: please note, cmd can't calculate decimal numbers, e.g. 1.23
set /a elapsedHr="(sec2-sec1)/3600"
echo This answer is %elapsedHr% hour(s) old (CET).

:: goto end of file
goto:eof

:GetInternational
:: Sets a bundle of variables by reading the registry settings
for /f "tokens=1,2*" %%a in ('reg query "HKCU\Control Panel\International"') do set "%%a=%%c"
goto :eof

:GetSecs "dateIn" "timeIn" secondsOut
::  Output:  Seconds elapsed since 1th Jan. 1970 00:00:00
setlocal
set "dateIn=%~1"
for /f "tokens=2" %%i in ("%dateIn%") do set "dateIn=%%i"
for /f "tokens=1-3 delims=%sDate%" %%a in ("%dateIn%") do (
  if %iDate%==0 set /a mm=100%%a%%100,dd=100%%b%%100,yy=10000%%c%%10000
  if %iDate%==1 set /a dd=100%%a%%100,mm=100%%b%%100,yy=10000%%c%%10000
  if %iDate%==2 set /a yy=10000%%a%%10000,mm=100%%b%%100,dd=100%%c%%100
)
for /f "tokens=1-3 delims=%sTime%%sDecimal% " %%a in ("%~2") do (
  set "hh=%%a"
  set "nn=%%b"
  set "ss=%%c"
)
if 1%hh% lss 20 set hh=0%hh%
if "%nn:~2,1%" equ "p" if "%hh%" neq "12" (set "hh=1%hh%" &set /a hh-=88)
if "%nn:~2,1%" equ "a" if "%hh%" equ "12" set "hh=00"
if "%nn:~2,1%" geq "a" set "nn=%nn:~0,2%"
set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2,j=j/5+dd+y*365+y/4-y/100+y/400-2472633,j=j*86400+hh*3600+nn*60+ss
endlocal &set "%~3=%j%"
goto :eof

Source: dostips.com

To get the file time and send the email I leave for the OP.

Upvotes: 4

Related Questions