如果文件夹内容未在时间段内更新,则批量警报

时间:2014-03-05 09:54:08

标签: file batch-file updates

每分钟都会使用新文件内容更新文件夹。

如果在最近五分钟内检测到受监控文件夹的内容尚未更新,则需要引发简单警报(例如,启动回显)。

例如

监控c:\ monitoredFiles 如果(c:\ monitoredFiles尚未在5分钟内更新){start echo'系统故障检测'}

3 个答案:

答案 0 :(得分:0)

这是我放在一起的快速和肮脏的东西。它基本上创建了文件夹G的目录列表:(因为这就是我所拥有的,你可以更改它)并将其保存在C :(你可以将它保存在其他地方)。然后每10秒生成一个新的目录列表,并使用FC(文件比较)将其与旧目录列表进行比较。如果它们没有改变,它会输出一条消息。您可以使用其他技术输出不同的消息。

@echo off
REM Start monitoring G:\
REM Goto our "working area"
C:
CD \
REM Generate initial listing
dir G:\ | FINDSTR /v (s) > old.tmp
:TOP
dir G:\ | FINDSTR /v (s) > new.tmp
fc new.tmp old.tmp > nul
if errorlevel 1 goto ok
echo No changes detected
:ok
del old.tmp 2> nul
ren new.tmp old.tmp
SLEEP 10
GOTO TOP

FINDSTR部分会抑制DIR列表底部的两行,以便更改可用空间的文件系统中其他位置的更改不会影响此程序。它搜索并删除(/ V)包含(s)的行,即最后有50个文件和5个Dir的那两行。

05/03/2014  10:23               845 z
14/02/2014  10:16                94 z.html
              50 File(s)     75,284,594 bytes
               5 Dir(s)  202,621,149,184 bytes free

请注意,我在开始时将目录更改为C:\,因为我不想在我正在监视的目录中写入,否则我将使其自行更改。显然,您可以编写您的版本以在任何您喜欢的地方生成文件 - 我就像C:\,因为它很可能存在。

答案 1 :(得分:0)

此脚本获取最新文件并检查它是否超过5分钟 它只会将消息回显到屏幕atm。

你可以在这样的循环中使用另一个脚本启动它 - 它每分钟运行一次:

@echo off
:loop
call "checkfolder.bat"
timeout /t 60 /nobreak
goto :loop

这是“checkfolder.bat”

@echo off
:: Wmic removes regional differences
:: XP Pro can have some filename errors due to the short filename bug

setlocal
:: set the number of minutes in the following line
set minutes=5

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "stamp=%YYYY% %MM% %DD% %HH% %Min%"
call :DateToMinutes %stamp% NowMins

set "name="
for /f "delims=" %%a in ('dir * /a-d /b /od ^|find /v /i "%~nx0"') do set "name=%%a"
if defined name call :CheckMins "%name%"
if %MinsOld% gtr %minutes% echo Folder hasn't been modified in %minutes% minutes & pause

goto :EOF

:CheckMins
set "filestamp="
set "filemins="
set "MinsOld="
set "YY=" & set "YYYY=" & set "MM=" & set "DD="
set "HH=" & set "Min=" & set "Sec=" & set "dt="
set "file=%~sf1"
:: can use CreationDate instead of lastmodified
WMIC DATAFILE WHERE name="%file:\=\\%" get lastmodified | find "." >file.tmp
for /f %%a in (file.tmp) do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "filestamp=%YYYY% %MM% %DD% %HH% %Min%"
del file.tmp 2>nul
if not defined yyyy goto :EOF

call :DateToMinutes %filestamp% FileMins
set /a MinsOld=%NowMins%-%FileMins%
goto :EOF

:DateToMinutes
setlocal
set yy=%1&set mm=%2&set dd=%3&set hh=%4&set nn=%5
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
if /i {%nn:~2,1%} EQU {p} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
if /i {%nn:~2,1%} EQU {a} if "%hh%" EQU "12" set hh=00
if /i {%nn:~2,1%} GEQ {a} set nn=%nn:~0,2%
set /a hh=100%hh%%%100,nn=100%nn%%%100,j=j*1440+hh*60+nn
endlocal&set %6=%j%&goto :EOF

答案 2 :(得分:0)

谢谢。我使用了您的脚本,但我不得不对其进行一些更改,因为它不适用于不同的语言。 我的修改版本适用于德国 Windows 版本,每 600 秒检查一次文件夹。如果没有更改,它会在 ifttt.com 上触发通知,导致我的手机发出哔哔声,因此我知道填充文件夹的应用程序一定崩溃了。 看门狗也会保存临时文件,所以我知道最后一次检查是什么时候,每一步有什么不同。

echo off
REM Start monitoring C:\Temp\test\tobewatched
REM Goto our "working area"
C:
CD \watchdog
REM Generate initial listing
dir C:\Temp\test\tobewatched\ | FINDSTR /v (se) > old.tmp
:TOP
dir C:\Temp\test\tobewatched\ | FINDSTR /v (se) > new.tmp
fc new.tmp old.tmp
echo %errorlevel%
if errorlevel 1 goto ok
REM Keine Aenderung in 600 Sekunden --> Alarm
curl -X POST https://maker.ifttt.com/trigger/notify/with/key/<youriftttkeygoeshere>
:ok

for %%F in (new.tmp) do set file=%%~fF
for /f "tokens=2 delims==" %%I in ('wmic datafile where name^="%file:\=\\%" get lastmodified /format:list') do set datetime=%%I
set datetime=%datetime:~0,14%
copy new.tmp comp%datetime%.txt

del old.tmp 2> nul
ren new.tmp old.tmp
@ping -n 600 localhost> nul
GOTO TOP