ZefRus
18-12-2017, 11:08
Добрый день, Уважаемые форумчане.
Поставили мне интересную задачу на решение. Вроде всё сделал и всё заработало но задачу тут же усложнили ввиду того, что текстовый файл на выходе весит под 1 мег (порядка 110 тыс. строк)..
Задача была следующая:
Есть сервер хранения видео записей с камер. Пишет сервер на различные логические буквы в папку Video. В этой папке сервер создаёт подпапку с датой события и часом, в который событие произошло (к примеру 01-03-17 00, значит события происходят 1 марта с 00:00 до 01:00). Само событие представляет из себя шифрованный кусок видео и не представляет интереса (есть и есть), а вот по имени события можно понять, что за камеры (шифрованное имя камеры) и сколько событий в этой папке есть. Имя события выглядит 0._122 . Запись означает, что есть нулевое событие у камеры _122. Достаточно увидеть, что есть событие "0".
Первая версия скрипта заходит в папку каждого часа и собирает её содержимое в текстовом файле, подставляя сначала имя папки. Выглядит примерно так
01-09-17 16
0._A0
01-09-17 17
0._A0
0._A1
01-10-17 00
0._107
0._10B
01-10-17 01
0._11F
0._120
Сейчас задачу сильно усложнили: нужно, что бы в текстовик писалось только одно событие по 1 камере за сутки. Т.е., нужно создавать массив дат и смотреть есть ли одинаковые имена событий.
Может кто сможет подсказать, как можно такое реализовать средствами CMD? Ниже привожу текст рабочего скрипта.
@echo off
rem ver.1.1, by Zef
set logpath=S:\log
set TMPF=C:\tempF
if not exist %logpath% net use s: \\192.168.9.5\target
if not exist %TMPF% (md %TMPF%)
if exist %logpath%\%ComputerName%_test.txt Del %logpath%\%ComputerName%_test.txt /f /q
if exist %TMPF%\listing.txt del /f /a %TMPF%\listing.txt
rem ____ START ____
rem цикл получения значений логических дисков
for /f "tokens=1,2 delims==:" %%i In ('
WMIC LOGICALDISK GET Name^,VolumeSerialNumber /VALUE^|find "="
') do (
if %%i==Name (
rem переход в папку video переменной j
cd /d %%j:\video
rem создание временного списка директорий в подкаталоге video переменной j
dir /b /a:d >> %TMPF%\listing.txt
rem цикл обработки директорий с событиями
FOR /F "usebackq delims=" %%k in (%TMPF%\listing.txt) do (
rem переход в директорию k с событиями
cd /d %%j:\video\%%k
rem просмотр содержимого k-той папки с событиями.
rem for /f %%m in ('dir "0.*" /b /o:e') do ( set event=%m:~-5% & echo %%k.%event% >> %logpath%\%ComputerName%_test.txt )
for /f %%m in ('dir "0.*" /b /o:e') do ( echo %%k.%%m >> %logpath%\%ComputerName%_test.txt )
)
del /f /a %TMPF%\listing.txt
)
)
Поставили мне интересную задачу на решение. Вроде всё сделал и всё заработало но задачу тут же усложнили ввиду того, что текстовый файл на выходе весит под 1 мег (порядка 110 тыс. строк)..
Задача была следующая:
Есть сервер хранения видео записей с камер. Пишет сервер на различные логические буквы в папку Video. В этой папке сервер создаёт подпапку с датой события и часом, в который событие произошло (к примеру 01-03-17 00, значит события происходят 1 марта с 00:00 до 01:00). Само событие представляет из себя шифрованный кусок видео и не представляет интереса (есть и есть), а вот по имени события можно понять, что за камеры (шифрованное имя камеры) и сколько событий в этой папке есть. Имя события выглядит 0._122 . Запись означает, что есть нулевое событие у камеры _122. Достаточно увидеть, что есть событие "0".
Первая версия скрипта заходит в папку каждого часа и собирает её содержимое в текстовом файле, подставляя сначала имя папки. Выглядит примерно так
01-09-17 16
0._A0
01-09-17 17
0._A0
0._A1
01-10-17 00
0._107
0._10B
01-10-17 01
0._11F
0._120
Сейчас задачу сильно усложнили: нужно, что бы в текстовик писалось только одно событие по 1 камере за сутки. Т.е., нужно создавать массив дат и смотреть есть ли одинаковые имена событий.
Может кто сможет подсказать, как можно такое реализовать средствами CMD? Ниже привожу текст рабочего скрипта.
@echo off
rem ver.1.1, by Zef
set logpath=S:\log
set TMPF=C:\tempF
if not exist %logpath% net use s: \\192.168.9.5\target
if not exist %TMPF% (md %TMPF%)
if exist %logpath%\%ComputerName%_test.txt Del %logpath%\%ComputerName%_test.txt /f /q
if exist %TMPF%\listing.txt del /f /a %TMPF%\listing.txt
rem ____ START ____
rem цикл получения значений логических дисков
for /f "tokens=1,2 delims==:" %%i In ('
WMIC LOGICALDISK GET Name^,VolumeSerialNumber /VALUE^|find "="
') do (
if %%i==Name (
rem переход в папку video переменной j
cd /d %%j:\video
rem создание временного списка директорий в подкаталоге video переменной j
dir /b /a:d >> %TMPF%\listing.txt
rem цикл обработки директорий с событиями
FOR /F "usebackq delims=" %%k in (%TMPF%\listing.txt) do (
rem переход в директорию k с событиями
cd /d %%j:\video\%%k
rem просмотр содержимого k-той папки с событиями.
rem for /f %%m in ('dir "0.*" /b /o:e') do ( set event=%m:~-5% & echo %%k.%event% >> %logpath%\%ComputerName%_test.txt )
for /f %%m in ('dir "0.*" /b /o:e') do ( echo %%k.%%m >> %logpath%\%ComputerName%_test.txt )
)
del /f /a %TMPF%\listing.txt
)
)