我们的系统每天每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
答案 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在today
或yesterday
,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行很重要。