Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 用于检测和检查日志文件的批处理脚本_Batch File_Cmd_Command - Fatal编程技术网

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

Batch file 用于检测和检查日志文件的批处理脚本,batch-file,cmd,command,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_201501182

我们的系统每天每隔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

此搜索范围为一个月。适应你的需要

@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
我将把输出的正确格式留给您

注意:不要在日志文件文件夹中尝试此代码;它会覆盖现有文件,因为我需要创建这些文件进行测试

@ECHO OFF SETLOCAL 设置sourcedir=U:\sourcedir\t w o 设定最后日期= 对于/f%%a IN'dir/b/o:-n/a-d%sourcedir%\LOG\u 2*,请设置lastfile=%a并转到扫描 :扫描 今天设置=%lastfile:~4,8% 设置lastfile=%lastfile:~4,12% 昨天=今天 ::从今天减去一天。如果最后两位数字为00,-68=yyyymm32 ::继续减法,直到找到适合短时间使用的日志文件。 :前一天 昨天设置/a-=1 如果百分比昨天:~-4%==0100套/a昨天-=8868&转到前一天 如果昨天的百分比:~-2%==00套/a昨天-=68套&GOTO前一天 如果不存在%sourcedir%\LOG\u%昨天%*转到前一天 对于预期中的%%a,发现缺少DO集/a%%a=0 对于100,1123中的/L%%h,对于00,15,30,45中的%%m,执行以下操作:检查%昨天%%h%%m SET reportline=beday%beday%expected%expected%found%found%missing%missing% 对于预期中的%%a,发现缺少DO集/a%%a=0 对于100,1123中的/L%%h,对于00,15,30,45中的%%m,执行以下操作:检查%today%%%h%%m 回显%reportline% 今天回显%Today%应为%expected%已为%found%已为%found%缺失%missing% 回显找到的上次文件日期时间%lastfile% 后藤:EOF :检查 设置checkstamp=%2 设置checkstamp=%1%checkstamp:~-4% 如果x%checkstamp%gtr x%lastfile%GOTO:EOF 设置/a预期值+=1 如果存在%sourcedir%\LOG\u%checkstamp%*设置/a找到+=1 ELSE集合/a缺失+=1 缺少回显:%checkstamp% 后藤:eof 我有理由相信这将适当地报告。您需要更改sourcedir的设置以适应您的环境

最新日志文件的名称是通过读取目录中匹配的名称、按名称的相反顺序排序并选择返回的第一个名称来找到的

今天是通过从该名称中选择12个字符来确定的,从字符4开始,将第一个字符计算为字符0

昨天是由该日期减去1确定的。如果结果字符串以0100结尾,则减去8868形成上一年的12月32日,否则如果今天以00结尾,则减去68获得上一个月的32日。 如果没有按昨天计算的日期的日志文件,则通过将log_uuu串在昨天的值之前并检查以该字符串开头的任何文件名来查找,然后继续从昨天减去1,直到找到文件名。这样,2月31日就找不到了,30日、29日也可能找不到了,比如28日。所以今天=3月1日,昨天=2月28日或29日

然后只需检查文件名开始日志_YYYYMMDDHHQQ-YYYYMMDD在今天或昨天,HH是00..23,QQ是00,15,30或45。以%%h为单位的小时从100迭代到123,然后用分钟数字串起来,这意味着提供给子程序检查的第二个参数的形式为10000..12345,分15分钟进行。删除前导的1,将结果字符串化为“LOG_uu”+相关日期,并检查是否有以该字符串开头的文件。要么在那里,要么不在

问题在于,如果要检查的日期+时间晚于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,即今天的20150121:0115。另一个是昨天的:20150120,2300

通常,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存在,因此未显示在缺失列表中。 在昨天预期的96份文件中,有1份被找到,95份丢失并被列出 今天的6个预期文件中有1个存在,5个丢失并列出

报告显示的是2012215,这意味着构建文件名时存在一些问题,但您尚未报告将显示今天和昨天计算的日期的最后一行。由于某种原因,我仍然看不到您目录中的文件名,因此我也无法分析它们。该过程依赖于目录中要计算的日志文件名超过一天

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

您还需要被告知多少次此过程依赖于日志文件上至少有两个日期?你最近的名单都有相同的日期

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

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

 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
以下是1月18日01:00至20:15之间的时间结果,已编辑:

Missing : 201501180000
Missing : 201501180015
Missing : 201501180030
Missing : 201501180045
... (edited-out : 76 lines)
Missing : 201501180030
Missing : 201501180045
Missing : 201501182030
Missing : 201501182045
Missing : 201501190245
Yesterday 20150118 expected 96 found 12 missing 84
Today     20150119 expected 14 found 13 missing 1
Last filedatetime found 201501190315
18日报道了84条线路,报告准确地说了这一点。 据报道,在00:00至03:15之间的14条预期线路中,有一条线路缺失,时间为02:45

重要的是剪切和粘贴,而不是重新键入,因为批处理语法是特定的,单个键入可能会导致混乱。您所需要做的就是将directoryname替换为您正在使用的directoryname


如果您还有其他问题,只需剪切您正在使用的实际代码,并将其粘贴到原始问题中,并附上适当的结果示例。缺少两行或三行就足够了,但最后三行很重要。

您应该发布您尝试过的代码。嗨,Jason,我还没有任何代码。你能帮忙吗?谢谢。嗨,马古,谢谢你的回复和帮助。我尝试了你的脚本,它给出了以下错误。D:\temp>test11.bat系统找不到指定的文件。这是我设置的dir路径,但无法检测。设置sourcedir=D:\temp\test\t如何正确设置?谢谢你的帮助。谢谢PeterU:\sourcedir\t w o只是我使用的一个测试目录,它故意在名称中包含空格,以确保在使用时正确处理空格。您只需要替换日志文件所在目录的名称。如您所见,将评论作为答案发布会产生一个无意义的结果。这是令人沮丧的-一些贫穷的成员沉迷于寻找和标记非答案,所以最好在警察到来之前删除它们。此外,签名和华夫饼干也不受欢迎。嗨,马古,谢谢你的回复。我已将路径设置为set sourcedir=D:\temp\logs,但没有输出。它只显示一个空白屏幕,脚本似乎没有输出。请给我一些建议。谢谢PeterI无法从这里查看您的目录。该脚本假定该目录中有今天的日志和昨天的日志。这样,它就可以检查今天到目前为止和昨天的所有情况。如果前一天的文件不存在,它会一遍又一遍地回顾,直到它最终到达今天——这可能需要一段时间。尝试包含至少两个不同日期文件的目录。嗨,Magoo,找到了。谢谢你的帮助。我在做一些测试。这一次,我只是将所有当前文件放入1目录,没有昨天的文件。以下是一些输出:缺失:2012115缺失:2012130缺失:2012145缺失:2012200缺失:2012215缺失:2012230嗨Stephan,谢谢你的回复和帮助。只是想知道是否有可能修改脚本,只检查特定日期?谢谢当然是彼得罗夫。只需删除几天的循环,并将%%d替换为您想要的一天。