【问题标题】:Batch file to check md5sum of log file用于检查日志文件 md5sum 的批处理文件
【发布时间】:2012-12-14 03:09:29
【问题描述】:

我需要一些帮助来制作服务应用程序批处理文件。

简而言之,应用程序会检查文件夹中是否有任何新文件,如果有,它会写入日志文件 (Results.txt)。

问题是,如果文件夹在 24 小时内没有“结果”,则通常有问题。 (要么是服务崩溃,要么是网络问题。)所以我需要编写一个批处理脚本来检查Results.txt 文件是否在过去24 小时内被更改过。

我的计划是每 24 小时运行一次批处理文件,检查 Results.txt 的 md5sum 以查看它是否已更改。但是,我不知道该怎么做。在伪代码中,它看起来像这样:

if not exist old.txt echo. > old.txt & fc "md5.txt" "old.txt"
%md5sum% Results.txt > md5.txt
set equal=no
if md5.txt==old.txt set equal=yes
if equal=no echo No results found in 24 hours >> log.txt

【问题讨论】:

    标签: logging batch-file md5 md5sum


    【解决方案1】:

    简单点怎么样?没有花哨的 MD5,只是 dir 命令的输出!这是有效的,因为如果它正在检查的目录中没有任何更改,则无论何时运行 dir 命令输出都将完全相同。

    有关帮助和更多选项,请参阅:

    dir /?
    fc /?
    

    例子:

    @echo off
    if not exist old_fingerprint.txt echo. > old_fingerprint.txt
    :: List the directory information, recursive, last write timestamps, 4 digit date
    dir /n /s /t:w /4 > new_fingerprint.txt
    :: Check out fc /? for all of the comparison options.
    fc new_fingerprint.txt old_fingerprint.txt
    :: fc sets errorlevel to 0 when the files match and not 0 when the files do not match.
    if %ErrorLevel% NEQ 0 echo.No results found in 24 hours>> log.txt
    

    如果您想隐藏批处理脚本的所有输出,只需在 fc 行后面输入 > nul

    更新: 根据提供的新信息。

    因此,您只需检查 Results.txt 文件的最后写入时间戳。只要您在没有更改的情况下不写入文件并更新时间戳。

    或者更好的是,如果您只关心文件夹内部是否有任何活动,只需检查该文件夹的“上次写入”时间戳即可。如果时间戳早于 24 小时,您可以处理 24 小时内未找到的结果。

    /t:w 选项与dir 命令一起使用,您可以解析所需的时间戳。

    TLDR:亲吻

    更新 2:

    这是一个示例脚本,展示了如何获取目录信息的纯细分。

    @echo off
    setlocal
    
    for /f "usebackq tokens=1,2,3,4,*" %%A in (`dir /a:d /l /n /t:w /4`) do (
        echo.
        echo.Date = %%A
        for /f "usebackq tokens=1,2,3 delims=/" %%X in ('%%A') do (
            echo.Month = %%X
            echo.Day = %%Y
            echo.Year = %%Z
        )
        echo.Time = %%B
        for /f "usebackq tokens=1,2 delims=:" %%X in ('%%B') do (
            echo.Hour = %%X
            echo.Minute = %%Y
        )
        echo.Meridiem = %%C
        echo.Type Raw = %%D
        for /f "usebackq tokens=1 delims=<>" %%X in ('%%D') do (
            echo.Type = %%X
        )
        echo.Name = %%E
        echo.
    )
    
    endlocal
    

    答案: 这是一个脚本,说明了获取和比较时间戳的简单方法。设置一个计划任务以每 24 小时运行一次此脚本,如果自上次运行以来时间戳未更改,它将在日志文件中打印一条消息。

    setlocal enabledelayedexpansion
    
    for /f "usebackq tokens=1,2,3,4,*" %%A in (`dir /a:d /l /n /t:w /4`) do (
        if /i "%%~E"=="Folder" (
            if exist "LastTimeStamp.txt" find /c /i "%%A %%B %%C %%E" LastTimeStamp.txt > nul
            if !ErrorLevel! EQU 0 echo.The folder time stamp has not changed since last checked. >> log.txt
            echo.%%A %%B %%C %%E > LastTimeStamp.txt
        )
    )
    
    endlocal
    

    【讨论】:

    • 不确定这是否正是我想要的。我需要它来检查文件 Results.txt,看看它是否在 24 小时内发生了变化,而不是目录。
    • 这是因为文件可以不断地从文件夹中添加和删除。如果脚本在一天开始时发现没有文件,并且整天都在添加和删除文件,但到第二天文件夹是空的,那么它将显示 24 小时内没有任何变化。这就是为什么我有一个脚本每 5 分钟检查一次(使用 dir),并在发生更改时写入时间和日期,并且需要另一个脚本来检查此文件是否在 24 小时内发生更改
    • 谢谢大卫,这似乎很适合我想要的。我不知道如何解析这些信息并检查它。澄清一下,我需要根据当前时间/日期检查上次修改的时间/日期,如果相差超过 24 小时,我需要它回显到日志文件中。我玩弄了 dir /t:w 但我不知道如何只为我想要的文件夹选择时间和日期,或者如何根据当前日期检查它!
    • @AlexPowell 我添加了第二个更新,以提供如何解析信息的示例以及利用解析的简单答案脚本。
    • 谢谢!这很棒。感谢您展示它的工作原理,对未来的项目非常有用
    【解决方案2】:

    这会将您目录中的文件与当前日期进行比较,如果它们比当前日期旧,那么它会告诉您哪些是新的(不一定需要),如果没有新的,则会记录它.

    如果您在一天结束时使用计划任务运行它,那么它应该可以正常工作。

    cd yourdir
    forfiles /d +%date% /s /c "cmd /c echo @file is new" 2>nul
    if %errorlevel%==1 echo No results found in 24 hours >>log.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      相关资源
      最近更新 更多