我需要一些帮助来制作服务应用程序批处理文件。
简而言之,应用程序会检查文件夹中是否有新文件,如果是,则会写入日志文件(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
答案 0 :(得分: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文件的最后写入时间戳。只要在没有更改时不写入文件并更新时间戳。
或者更好的是,如果您关心的是文件夹内是否有任何活动,只需检查该文件夹的最后一次写入&#39;时间戳。如果时间戳超过24小时,您可以在24小时内处理无结果。
将/t:w
选项与dir
命令一起使用,您可以解析所需的时间戳。
TLDR: KISS
更新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
答案 1 :(得分: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