2

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

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

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

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

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
4

2 回答 2

0

简单点怎么样?没有花哨的 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

如果你想隐藏批处理脚本的所有输出,只需在> nul后面加上一个fc

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

因此,您只需要检查 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
于 2012-12-14T05:06:50.783 回答
0

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

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

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
于 2012-12-14T11:14:52.960 回答