2015-01-19 2 views
0

Наша система генерирует случайные файлы журналов со штампом даты и времени каждые 15 минут ежедневно, как показано ниже. Есть много файлов, созданных в день, как частота составляет 15 минут, и это головная боль, чтобы проверить их 1 на 1.Пакетный скрипт для обнаружения и проверки файлов журнала

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 для проверки и обнаружения отсутствующих файлов на основе текущей даты? Можно ли проверить, сколько файлов отсутствует?


Результаты кода Стефана:

Благодарим Вас за ответ и помощь.

Я попробовал ваш сценарий, и вот результат:

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

Hi Jason, У меня пока нет кодов. Сможете ли вы помочь? Благодарю. – Peter

ответ

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 

Я оставляю для вас правильное форматирование вывода.

ПРИМЕЧАНИЕ: не пытайтесь использовать этот код в папке вашего журнала; он переписывает файлы поддержки существующих (как мне нужно, чтобы создать их для тестирования)

+0

Привет, Стефан, спасибо за ваш ответ и помощь. Просто интересно, можно ли изменить сценарий, чтобы проверить только конкретную дату? Благодарю. - Питер – Peter

+0

конечно. Просто удалите цикл за дни и замените '%% d' на ваш желаемый день. – Stephan

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 символов от этого имени, начиная с «символа 4» (считая 1-й, как «символ 0»)

«вчера» определяется путем вычитания 1 из этой даты. Если результирующая строка заканчивается «0100», то вычесть 8868, чтобы сформировать 32 декабря в предыдущем году, иначе, если «сегодня» заканчивается «00», вычесть 68 для получения 32-го числа предыдущего месяца. Если для даты, рассчитанной как «вчера», нет файла журнала, найденного путем наложения «LOG_» перед значением «вчера» и проверки имени файла, начинающегося с этой строки, затем продолжайте вычитать 1 со вчерашнего дня, пока не будет найдено имя файла , Таким образом, «31 февраля» не будет найдено ни 30-го, ни 29-го (вероятно), а 28-го будут найдены, например. SO Today = 1 марта, вчера = 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, который является «сегодня»: 20150121 в 0115. Другой для «вчера»: 20150120 в 2300.

Обычно 4 * 24 = 96 файлов производятся за 1 день. Это должно сохраняться в течение дня, кроме , сегодня. За вчерашний день осталось только один файл, поэтому 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 списке.
из 96 ожидаемых файлов за вчерашний день, 1 не найдено, 95 отсутствуют (и перечислены)
Из 6 ожидаемых файлов на сегодня 1 присутствует и 5 отсутствуют и перечислены.

Тот факт, что отчет показывает 2012215 означает, что есть какая-то проблема с построением файла, но вы не сообщили последние строки, которые будут отображаться датами, рассчитанные для today и yesterday. Я по-прежнему почему-то не вижу файлы в вашем каталоге, поэтому я не могу их анализировать. Процедура основана на том, что в каталоге содержится более одного дня logfilenames для вычисления yesterday.


Сколько еще раз вам нужно попросить РЕДАКТИРОВАТЬ запрошенные данные в ваш вопрос, не добавить его как «ответ», чтобы быть удалены модераторами?

Сколько еще раз вам нужно сказать, что эта процедура зависит от наличия по крайней мере двух дат на лог-файлах? У вашего последнего списка все одинаковые даты.

Сколько еще раз нужно просить предоставить последние строки отчета, которые показывают определение процедуры для даты и сегодня и вчера?

Вот список каталогов исходного списка журналов. Я удалил один файл, LOG_201501190245.txt для демонстрации. Обратите внимание, что в списке есть файлы, созданные как с 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 

Вот результат со временем на Jan 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 

Итак - 84 линии сообщил на 18, говорится в докладе, что именно.
Из 14 ожидаемых линий между 00:00 и 03:15, один отсутствует - 02:45, как сообщалось.

Важно, чтобы вырезать и вставлять, а не повторно, поскольку синтаксис пакета специфичен, и одна опечатка может вызвать хаос. Все, что вам нужно сделать, это заменить имя каталога на имя каталога, которое вы используете.

Если у вас есть дополнительные проблемы, просто вырежьте фактический код, который вы используете, и вставьте его в исходный вопрос с соответствующим образцом результатов. Достаточно двух или трех «пропущенных» строк, но последние 3 строки являются критическими.

+0

Hi Magoo, Спасибо за ваш ответ и помощь. Я пробовал свой скрипт, и он дает ошибку ниже. ** D:. \ TEMP> test11.bat ** T ** он система не может найти указанный файл ** Это путь реж что я установил, но он не может обнаружить. ** SET «sourcedir = D: \ temp \ test \ t w o" ** Как это правильно установить? Цените свою помощь. Спасибо. - Peter – Peter

+0

'U: \ sourcedir \ t w o' - это просто тестовый каталог, который я использую, который преднамеренно включает пробелы в имени, чтобы гарантировать, что пробелы будут обработаны правильно, если они будут использованы. Вам просто нужно подставить имя каталога, в котором находятся ваши файлы журналов. Как вы видите, публикация комментария как «ответ» дает бессмысленный результат. Это обескуражено - некоторые бедные члены одержимы поиском и помещением не ответов, поэтому лучше всего удалить их до того, как * polizei * прибудет. Также подшучивают подписи и вафли. – Magoo

+0

Привет Магу, спасибо за ответ. Я установил путь к SET «sourcedir = D: \ temp \ logs», но нет выхода. Он показывает только пустой экран, и скрипт, похоже, работает без вывода. Пожалуйста посоветуй. Благодарю. Peter – Peter

Смежные вопросы