用于检测和检查日志文件的批处理脚本

时间:2015-01-19 09:48:46

标签: batch-file cmd command

我们的系统每天每15分钟生成一些随机日志文件,上面印有日期和时间,如下面的清单所示。由于频率为15分钟,一天内会生成大量文件,因此逐一检查它们会很头疼。

LOG_20150118210000.txt
LOG_20150118211501.txt
LOG_20150118213000.txt
LOG_20150118214501.txt
LOG_20150118220000.txt
LOG_20150118221500.txt
LOG_20150118223000.txt
LOG_20150118224500.txt
LOG_20150118230001.txt
LOG_20150118231500.txt
LOG_20150118233001.txt
LOG_20150118234500.txt
LOG_20150119000001.txt
LOG_20150119001500.txt
LOG_20150119003001.txt
LOG_20150119004500.txt
LOG_20150119010000.txt
LOG_20150119011501.txt
LOG_20150119013000.txt
LOG_20150119014501.txt
LOG_20150119020000.txt
LOG_20150119021500.txt
LOG_20150119023000.txt
LOG_20150119024500.txt
LOG_20150119030000.txt
LOG_20150119031501.txt

丢失文件样本(5个文件):

LOG_20150118233001.txt
LOG_20150118234500.txt
LOG_20150119000001.txt
LOG_20150119001500.txt
LOG_20150119003001.txt

如何根据当前日期编写dos批处理脚本来检查和检测丢失的文件?是否可以检查丢失了多少文件?


Stephan代码的结果:

感谢您的回复和帮助。

我已经尝试过您的脚本,这是输出:

D:\temp>test1.bat
File Not Found
expected files:

---------- SHOULD.TXT: 2976

found files:

---------- IS.TXT: 0

these files are missing:
FINDSTR: No search strings

你能帮忙告诉我这个输出是什么意思吗?

为了进行测试,我删除了1个文件,但看不到脚本检测到它。


以下是一些示例日志,没有列出所有日志:

LOG_20150119000001.txt
LOG_20150119001500.txt
LOG_20150119003001.txt
...
...
...
LOG_20150119231500.txt
LOG_20150119233001.txt
LOG_20150119234500.txt

2 个答案:

答案 0 :(得分:0)

这会搜索一个月的范围。适应您的需求。

@echo off
setlocal enabledelayedexpansion

REM generate list with all expected files:
REM omitting the seconds, as they are more or less random
(for /l %%d in (1,1,31) do (
  set d=0%%d
  set d=!d:~-2!
  for /l %%h in (0,1,23) do (
    set h=0%%h
    set h=!h:~-2!
    for %%m in (00 15 30 45) do (
      echo Log_201501!d!!h!%%m
        REM generate files with some missing:
        REM for testing; you don't need the following line:
        if !random! geq 500 break>Log_201501!d!!h!%%m00.txt
    )
  )
))>should.txt

REM generate list with all existing files:
(for /f %%i in ('dir /on /b LOG_2015*.txt') do (
  REM deleting the seconds also to be comparable
  set i=%%i
  echo !i:~0,16!
))>is.txt

echo expected files:
find /c "Log_2015" should.txt
echo/
echo found files:
find /c "Log_2015" is.txt
echo/
echo these files are missing:
findstr /v /g:is.txt should.txt

我会为您输出正确的输出格式。

注意:请勿在日志文件夹中尝试此代码;它会覆盖现有文件(因为我需要创建它们进行测试)

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "lastdate="
FOR /f %%a IN ('dir /b /o:-n /a-d "%sourcedir%\LOG_2*"') DO SET "lastfile=%%a"&GOTO scan
:scan
SET "today=%lastfile:~4,8%"
SET "lastfile=%lastfile:~4,12%"
SET /a yesterday=today
:: subtract 1 day from today. if last 2 digits are 00, -68=yyyymm32
:: keep subtracting until logfile found to cater for short months.
:prevday
SET /a yesterday -=1
IF %yesterday:~-4%==0100 SET /a yesterday -=8868&GOTO prevday
IF %yesterday:~-2%==00 SET /a yesterday -=68&GOTO prevday
IF NOT EXIST "%sourcedir%\LOG_%yesterday%*" GOTO prevday
FOR %%a IN (expected found missing) DO SET /a %%a=0
FOR /L %%h IN (100,1,123) DO FOR %%m IN (00,15,30,45) DO CALL :check %yesterday% %%h%%m
SET "reportline=Yesterday %yesterday% expected %expected% found %found% missing %missing%"
FOR %%a IN (expected found missing) DO SET /a %%a=0
FOR /L %%h IN (100,1,123) DO FOR %%m IN (00,15,30,45) DO CALL :check %today% %%h%%m
ECHO %reportline%
ECHO Today     %today% expected %expected% found %found% missing %missing%
ECHO Last filedatetime found %lastfile%

GOTO :EOF

:check
SET checkstamp=%2
SET checkstamp=%1%checkstamp:~-4%
IF x%checkstamp% gtr x%lastfile% GOTO :EOF
SET /a expected +=1
IF EXIST "%sourcedir%\LOG_%checkstamp%*" (SET /a found +=1
 ) ELSE (SET /a missing+=1
 ECHO Missing : %checkstamp%)

GOTO :eof

我有理由相信这会报告得恰当。您需要更改sourcedir的设置以适合您的具体情况。

通过读取匹配名称的目录,以反向名称顺序排序并选择返回的第一个名称,可以找到最新日志文件的名称。

"今天"通过从该名称中选择12个字符来确定,从#34开始;字符4和#34; (将第1个计为"字符0和#34;)

"昨天"通过从该日期减1来确定。如果结果字符串结束" 0100"然后在上一年的12月32日减去8868,否则如果"今天"结束" 00",减去68以获得上个月的第32个。 如果日期没有日志文件计算为"昨天",通过字符串" LOG _"找到在"昨天"之前的价值之前并检查以该字符串开头的任何文件名,然后从昨天开始减1,直到找到文件名。通过这种方式," 2月31日"不会被发现,也不会被发现,也就是30日,也可能是29日(可能),但是会发现第28名。所以今天= 3月1日,昨天= 2月28日或29日。

然后,只需检查文件名开始" LOG_YYYYMMDDHHQQ" - YYYYMMDD在todayyesterday,HH是00..23,QQ是00,15,30或45. %%h中的小时从100迭代到123然后串联使用分钟数字表示提供给子例程check的第二个参数的格式为10000 .. 12345,步长为15分钟。丢弃前导1并将结果字符串添加到' LOG _' +相关日期并检查以该字符串开头的文件。无论是否在那里。

如果要检查的日期+时间晚于最后一个日期+时间(lastfile),那么它就是未来的文件名(例如今天下午5点,但是'现在只有午餐时间)所以我们只是跳过检查和计数。

这里真正的问题是要比较的值是> 2147483647所以我们必须通过在要比较的字符串中包含非数字来强制if进入字母模式。

示例:

 Directory of U:\sourcedir\t w o

21/01/2015  14:49                 0 log_20150120230016.txt
21/01/2015  14:49                 0 log_20150121011501.txt
               2 File(s)              0 bytes
               0 Dir(s)   2,126,053,376 bytes free

目录列表,显示指定格式的两个日志文件名称。最新的是log_20150121011501,即#34;今天":20150121在0115.另一个是"昨天":20150120在2300。

通常,1天内会产生4 * 24 = 96个文件。这应该适用于今天以外的任何一天。昨天只有一个文件存在,因此缺少95个文件。

今天,我们只能确定日志文件是否已创建到01:15。我们可能会在01:17运行此功能,因此预计在01:15之后拥有今天的文件是完全合理的。这将是今天的6个文件(0000,0015,0030,0045,0010,0015)。存在1,缺少5。

此程序的结果是:(没有必要列出所有内容)

...
Missing : 201501202230
Missing : 201501202245
Missing : 201501202315
Missing : 201501202330
Missing : 201501202345
Missing : 201501210000
Missing : 201501210015
Missing : 201501210030
Missing : 201501210045
Missing : 201501210100
Yesterday 20150120 expected 96 found 1 missing 95
Today     20150121 expected 6 found 1 missing 5
Last filedatetime found 201501210115

由于存在201501202300,因此missing列表中未显示。{p} 在昨天的96个预期文件中,发现1个,95个缺失(和列出)
在今天的6个预期文件中,1个存在,5个丢失并列出。

报告显示2012215这一事实意味着构建文件名存在一些问题,但您尚未报告最终行,这些行将显示为{{1}计算的日期}和today。我仍然出于某种原因看不到你目录中的文件名,所以我也无法对它们进行分析。该过程依赖于目录中有多于一天的日志文件名来计算yesterday


您需要多少次被要求将所请求的数据编辑到您的问题中,而不是将其添加为"答案"被版主删除?

您需要多少次被告知此过程依赖于日志文件中至少有两个日期?您的最新列表都具有相同的日期。

您需要多少次被要求提供报告的最后几行,以显示程序确定今天和昨天的日期?

这是原始日志文件列表的目录列表。我删除了一个文件LOG_201501190245.txt进行演示。请注意,该列表包含1月18日和19日生成的文件。

yesterday

以下是1月18日01:00到20:15之间的结果:#/ p>

 Volume in drive U has no label.
 Volume Serial Number is 02F1-3000

 Directory of u:\sourcedir\t w o

21/01/2015  16:22                 0 LOG_20150118210000.txt
21/01/2015  16:22                 0 LOG_20150118211501.txt
21/01/2015  16:22                 0 LOG_20150118213000.txt
21/01/2015  16:22                 0 LOG_20150118214501.txt
21/01/2015  16:22                 0 LOG_20150118220000.txt
21/01/2015  16:22                 0 LOG_20150118221500.txt
21/01/2015  16:22                 0 LOG_20150118223000.txt
21/01/2015  16:22                 0 LOG_20150118224500.txt
21/01/2015  16:22                 0 LOG_20150118230001.txt
21/01/2015  16:22                 0 LOG_20150118231500.txt
21/01/2015  16:22                 0 LOG_20150118233001.txt
21/01/2015  16:22                 0 LOG_20150118234500.txt
21/01/2015  16:22                 0 LOG_20150119000001.txt
21/01/2015  16:22                 0 LOG_20150119001500.txt
21/01/2015  16:22                 0 LOG_20150119003001.txt
21/01/2015  16:22                 0 LOG_20150119004500.txt
21/01/2015  16:22                 0 LOG_20150119010000.txt
21/01/2015  16:22                 0 LOG_20150119011501.txt
21/01/2015  16:22                 0 LOG_20150119013000.txt
21/01/2015  16:22                 0 LOG_20150119014501.txt
21/01/2015  16:22                 0 LOG_20150119020000.txt
21/01/2015  16:22                 0 LOG_20150119021500.txt
21/01/2015  16:22                 0 LOG_20150119023000.txt
21/01/2015  16:22                 0 LOG_20150119024500.txt
21/01/2015  16:22                 0 LOG_20150119030000.txt
21/01/2015  16:22                 0 LOG_20150119031501.txt
              26 File(s)              0 bytes
               0 Dir(s)   2,134,638,592 bytes free

所以 - 据报道,有84条生产线排在第18位,报告恰恰说明了这一点 据报道,在00:00和03:15之间的14条预期线中,有一条线丢失了 - 02:45。

剪切和粘贴非常重要,而不是重新键入,因为批处理语法是特定的,并且单个拼写错误会导致混乱。您需要做的就是将目录名替换为您正在使用的目录名。

如果您还有其他问题,只需剪切您正在使用的实际代码并将其粘贴到原始问题中,并使用适当的结果样本。两三个"失踪"线条足够,但最后3行很重要。