【问题标题】:Batch alert if folder content not updated within time period如果文件夹内容在时间段内未更新,则批量提醒
【发布时间】:2014-04-07 07:12:16
【问题描述】:

文件夹每分钟更新一次新的文件内容。

如果检测到受监控文件夹的内容在过去五分钟内没有更新,则需要发出简单的警报(例如启动回显)。

例如,

监控 c:\monitoredFiles if (c:\monitoredFiles 5 分钟内没有更新) {start echo 'System Malfunction Detected'}

【问题讨论】:

    标签: file batch-file updates


    【解决方案1】:

    谢谢。我使用了您的脚本,但我不得不对其进行一些更改,因为它不适用于不同的语言。 我的修改版本适用于德语 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
    

    【讨论】:

    • 使用dir |findstr /VBC:" " 保持国际化(删除以空格开头的行,从而删除标题和摘要行)
    【解决方案2】:

    此脚本获取最新文件并检查它是否超过 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
    

    【讨论】:

      【解决方案3】:

      这是我整理的又快又脏的东西。它基本上创建了文件夹 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 列表底部的两行,以便文件系统中其他地方更改可用空间的更改不会影响此程序。它搜索并删除包含 (s) 的 (/V) 行,即末尾有 50 个文件和 5 个目录的那两行。

      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:\ 因为它很可能存在。

      【讨论】:

      • 谢谢你,马克,我期待着试试这个:)
      • 这对你有用吗?如果是这样,请接受我的回答,以便我得到一个可爱的绿色大勾号。如果没有,请说出出了什么问题,以便我或比我聪明的人可以进一步帮助您。谢谢
      猜你喜欢
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      相关资源
      最近更新 更多