Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Отчет по целостности файлов (http://forum.oszone.net/showthread.php?t=312930)

The_Immortal 20-03-2016 21:43 2618092

Отчет по целостности файлов
 
Приветствую!

Необходимо через утилиту 7za.exe проверить все файлы расширения docx в каталоге и подкаталогах на целостность. Из получившегося списка необходимо выделить список (имена) файлов, у которых возникли ошибки или предупреждения.

Запуск утилиты произвожу таким образом:
Код:

7za t c:\DirToCheck\*.docx -bse0
Получаю такой результат:
Цитата:

7-Zip (a) [64] 15.14 : Copyright (c) 1999-2015 Igor Pavlov : 2015-12-31

Scanning the drive for archives:
3 files, 3045799 bytes (2975 KiB)

Testing archive: c:\DirToCheck\bad.docx
--
Path = c:\DirToCheck\bad.docx
Type = zip
Physical Size = 145588


Sub items Errors: 7

Testing archive: c:\DirToCheck\good.docx
--
Path = c:\DirToCheck\good.docx
Type = zip
Physical Size = 17139

Everything is Ok

Testing archive: c:\DirToCheck\warning.docx

WARNINGS:
There are data after the end of archive

--
Path = c:\DirToCheck\warning.docx
Type = zip
WARNINGS:
There are data after the end of archive
Physical Size = 20567
Tail Size = 2862505

Everything is Ok

Archives: 3
OK archives: 1
Archives with Errors: 1
Archives with Warnings: 1

Warnings: 1

Sub items Errors: 7
Из этого всего мне нужно получить лишь список следующих файлов:
Цитата:

c:\DirToCheck\bad.docx
c:\DirToCheck\warning.docx
, потому как у этих файлов есть ошибки (Error) или предупреждения (Warning).

Теперь пытаюсь сделать это в скрипте:
Код:

for /f "delims=" %a in ('dir c:\DirToCheck\*.doc /b /s /a-d') do 7za t "%a" -bse0 | FIND "Warn"
Здесь мне необходимо добавить как-то в условие FIND "Err", а также в случае нахождения одного из этих двух слов, перенаправлять имя файла в log.txt. Помогите, пожалуйста, это организовать.

Спасибо!

Iska 20-03-2016 22:07 2618095

Почему не просто воспользоваться кодом возврата 7-Zip? Наподобие (пишу по памяти, не проверялось):
Код:

… do >nul 2>&1 7za.exe t "%a" -bse0 || echo %a

Georgio 20-03-2016 22:45 2618100

Или так:

Код:

for /f "delims=" %%a in ('dir "C:\DirToCheck\*.doc" /b /s /a-d') do (
 7za t "%%a" -bse0 | >nul find /i "Everything is Ok"|| >>"log.txt" echo %%a
)

.

The_Immortal 20-03-2016 22:53 2618104

Iska, результатом такого скрипта будет следующее:
Код:

c:\7z1514-extra\x64>7za t "c:\DirToCheck\bad.docx" -bse0  1>nul 2>&1  || echo c:\DirToCheck\bad.docx
c:\DirToCheck\bad.docx

c:\7z1514-extra\x64>7za t "c:\DirToCheck\good.docx" -bse0  1>nul 2>&1  || echo c:\DirToCheck\good.docx

c:\7z1514-extra\x64>7za t "c:\DirToCheck\warning.docx" -bse0  1>nul 2>&1  || echo c:\DirToCheck\warning.docx

Т.е имя файла выдается в случае ошибки, а ещё нужно учитывать предупреждение...

Georgio, фраза "Everything is Ok" также фигурирует в случае, если файл имеет предупреждение, поэтому от неё отталкиваться нельзя...

Georgio 20-03-2016 23:18 2618113

Тогда как-то так:

Код:

for /f "delims=" %%a in ('dir "C:\DirToCheck\*.doc" /b /s /a-d') do (
 7za t "%%a" -bse0 | >nul findstr /i "error warning"&& >>"log.txt" echo %%a
)

.

The_Immortal 20-03-2016 23:21 2618114

Georgio, большущее спасибо!

Iska 20-03-2016 23:49 2618118

Цитата:

Цитата The_Immortal
а ещё нужно учитывать предупреждение... »

Значит, Ваши «Warning» имеют какое-то другое происхождение, поскольку «Exit Codes from 7-Zip» трактует однозначно:
Цитата:

7-Zip returns the following exit codes:

Code Meaning
0 No error
1 Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.
2 Fatal error
7 Command line error
8 Not enough memory for operation
255 User stopped the process


Время: 08:56.

Время: 08:56.
© OSzone.net 2001-