А АThursday 25 February 2016

Автоматизация проверки файловых архивов (rar, zip, arj).

Всем привет.

Недавно довелось проверять почтовые архивы на dvd дисках. Дисков много, а файлов еще больше. Надо было убедиться что все из них читабельны, чтобы от этих архивов был еще толк в будущем. Архивы создавал и записывал то один администратор почты то другой, поэтому там сейчас мирно живут и zip-ы, и arj, и  rar. Этакая архивная солянка. 

Но все мы знаем что у любого из архиваторов есть опция проверки архива на целостность (t: Test integrity of archive). Поэтому написать командный файл для их проверки не составляет труда. Даже нашел похожий файлик с кодами возврата ERRORLEVEL где каждый тип архива проверял родной архиватор: PkunZip, ARJ и WinRAR соответственно.

Более того, можно использовать WinRAR для проверки всех трех типов архивов. Ну для вас это не секрет.

Но я захотел внести что-то новое в существующее решение. Причин этому несколько. 

Первая - PkunZip, ARJ и WinRAR являются платными утилитами. Вы не знали? Знали, знали, просто вовремя забыли.)

Вторая - при ошибках в архивах WinRAR выбрасывает дополнительное окно, что для полной автоматизации проверки совсем не кстати.

Начнем поиск решения со второго пункта. Для WinRAR есть консольная версия RAR, которая работает с теми же ключами проверки. Уже лучше. Но и консольная версия RAR требует лицензию. Хм, что же делать? Не было печали, для WinRAR есть консольная бесплатная версия распаковщика UnRAR. Cупер! И она тоже годится для проверки всех трех типов? А вот и нет, версия UnRAR проверяет только RAR-архивы. Ладно, что есть то есть.


Теперь решаем первый вопрос - ищем бесплатную утилиту. Предлагаю 7Zip Игоря Павлова. Не может быть! Оказывается может. Берем консольную версию 7Z и проверяем... все три типа архивов. Чудненько!

Ниже привожу финальную версию командного файла. Оставляю весь код что был, и что добавил сам. Разобраться вам будет не трудно.

Параметром %1 задается имя папки с архивами.
Результатом будут соответствующие файлы-журналы *.log

@echo off
if %1.==. goto noparam

проверка c помощью ARJ
For /R %1 %%f in (*.arj) Do Call :ARJLog %%f MCD-arj.log
проверка c помощью UnRAR
For /R %1 %%f in (*.rar) Do Call :unRARLog %%f MCD-unrar.log
проверка c помощью UnZip
For /R %1 %%f in (*.zip) Do Call :PKZLog %%f MCD-unzip.log

проверка c помощью WinRAR
For /R %1 %%f in (*.rar *.zip *.arj) Do Call :RARLog %%f MCD-rar.log
проверка c помощью 7Z
For /R %1 %%f in (*.rar *.zip *.arj) Do Call :7ZLog %%f MCD-7z.log

GoTo :EOF

:noparam
@echo No folder for checking ?!?
GoTo :EOF

:7ZLog
7z.exe t %1  
GoTo PointZ%Errorlevel%
:PointZ0
Echo %Date% %Time% %~f1 No error>> %2
Goto :End
:PointZ1
Echo %Date% %Time% %~f1 Warning error>> %2
Goto :End
:PointZ2
Echo %Date% %Time% %~f1 Fatal error>> %2
Goto :End
:PointZ7
Echo %Date% %Time% %~f1 Command line error>> %2
Goto :End
:PointZ8
Echo %Date% %Time% %~f1 Not enough memory for operation>> %2
Goto :End
:PointZ255
Echo %Date% %Time% %~f1 Unexpected exit by Control-Break>> %2
Goto :End

:unRARLog
UnRAR.exe t -ibck %1 
GoTo PointuAR%Errorlevel%
:PointuAR0
Echo %Date% %Time% %~f1 No error>> %2
Goto :End
:PointuAR1
Echo %Date% %Time% %~f1 Warning error>> %2
Goto :End
:PointuAR2
Echo %Date% %Time% %~f1 Fatal error>> %2
Goto :End
:PointuAR3
Echo %Date% %Time% %~f1 CRC error>> %2
Goto :End
:PointuAR4
Echo %Date% %Time% %~f1 Modify attempt>> %2
Goto :End
:PointuAR5
Echo %Date% %Time% %~f1 Write error>> %2
Goto :End
:PointuAR6
Echo %Date% %Time% %~f1 Open error>> %2
Goto :End
:PointuAR7
Echo %Date% %Time% %~f1 Command line error>> %2
Goto :End
:PointuAR8
Echo %Date% %Time% %~f1 Not enough memory for operation>> %2
Goto :End
:PointuAR9
Echo %Date% %Time% %~f1 Create archive error>> %2
Goto :End
:PointuAR255
Echo %Date% %Time% %~f1 Unexpected exit by Control-Break>> %2
Goto :End


:RARLog
WinRAR.exe t -ibck %1 
GoTo PointuRAR%Errorlevel%
:PointuRAR0
Echo %Date% %Time% %~f1 No error>> %2
Goto :End
:PointuRAR1
Echo %Date% %Time% %~f1 Warning error>> %2
Goto :End
:PointuRAR2
Echo %Date% %Time% %~f1 Fatal error>> %2
Goto :End
:PointuRAR3
Echo %Date% %Time% %~f1 CRC error>> %2
Goto :End
:PointuRAR4
Echo %Date% %Time% %~f1 Modify attempt>> %2
Goto :End
:PointuRAR5
Echo %Date% %Time% %~f1 Write error>> %2
Goto :End
:PointuRAR6
Echo %Date% %Time% %~f1 Open error>> %2
Goto :End
:PointuRAR7
Echo %Date% %Time% %~f1 Command line error>> %2
Goto :End
:PointuRAR8
Echo %Date% %Time% %~f1 Not enough memory for operation>> %2
Goto :End
:PointuRAR9
Echo %Date% %Time% %~f1 Create archive error>> %2
Goto :End
:PointuRAR255
Echo %Date% %Time% %~f1 Unexpected exit by Control-Break>> %2
Goto :End


:PKZLog
unzip.exe -t %1  
GoTo PointPKZ%Errorlevel%
:PointPKZ0
Echo %Date% %Time% %~f1 No error>> %2
Goto :End
:PointPKZ1
Echo %Date% %Time% %~f1 Warning error>> %2
Goto :End
:PointPKZ2
Echo %Date% %Time% %~f1 Fatal error>> %2
Goto :End
:PointPKZ4
Echo %Date% %Time% %~f1 Insufficient Memory>> %2
Goto :End
:PointPKZ9
Echo %Date% %Time% %~f1 File not found>> %2
Goto :End
:PointPKZ10
Echo %Date% %Time% %~f1 Bad or illegal parameters specified>> %2
Goto :End
:PointPKZ11
Echo %Date% %Time% %~f1 File not found for extracting>> %2
Goto :End
:PointPKZ50
Echo %Date% %Time% %~f1 Full disk>> %2
Goto :End
:PointPKZ51
Echo %Date% %Time% %~f1 Unexpected EOF in ZIP file>> %2
Goto :End
:PointPKZ255
Echo %Date% %Time% %~f1 Unexpected exit by Control-Break>> %2
Goto :End


:ARJLog
Arj.exe t %1  
GoTo PointARJ%Errorlevel%
:PointARJ0
Echo %Date% %Time% %~f1 No error>> %2
Goto :End
:PointARJ1
Echo %Date% %Time% %~f1 Warning error>> %2
Goto :End
:PointARJ2
Echo %Date% %Time% %~f1 Fatal error>> %2
Goto :End
:PointARJ3
Echo %Date% %Time% %~f1 CRC/Password error>> %2
Goto :End
:PointARJ4
Echo %Date% %Time% %~f1 Modify error>> %2
Goto :End
:PointARJ5
Echo %Date% %Time% %~f1 Write error>> %2
Goto :End
:PointARJ6
Echo %Date% %Time% %~f1 Open error>> %2
Goto :End
:PointARJ7
Echo %Date% %Time% %~f1 Command line error>> %2
Goto :End
:PointARJ8
Echo %Date% %Time% %~f1 Insufficient Memory>> %2
Goto :End
:PointARJ9
Echo %Date% %Time% %~f1 It's not ARJ-file>> %2
Goto :End
:PointARJ10
Echo %Date% %Time% %~f1 DOS: XMS error>> %2
Goto :End
:PointARJ11
Echo %Date% %Time% %~f1 Unexpected exit by Control-Break>> %2
Goto :End
:PointARJ12
Echo %Date% %Time% %~f1 Overload limit in 250 copies>> %2
:End

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное