Batch file 用于检测和检查日志文件的批处理脚本
我们的系统每天每隔15分钟生成一些带有日期和时间戳的随机日志文件,如下所示。一天内会生成很多文件,因为频率为15分钟,一个接一个地检查这些文件让人头疼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
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替换为您想要的一天。