Войти

Показать полную графическую версию : [решено] Некорректно отрабатывает скрипт, помогите найти ошибку.


Falcon99
30-07-2018, 17:22
Не могу понять почему некорректно отрабатывает скрипт.
Скрипт должен брать из списка название файла. Потом упаковывать есть в zip, добавляя к названию файла дату изменения файла. После чего тестировать архи, если архив нормальный, то исходный файл удаляется.
Скрипт:
@echo off
set list="c:\temp\list.txt"
cd "C:\Program Files\7-Zip"
Setlocal EnableDelayedExpansion
for /f "usebackq delims=" %%x in (%list%) do (
call :yesterday "%%x"
set day_file=!ddmmyyyy:~0,2!
set month_file=!ddmmyyyy:~3,2!
set year_file=!ddmmyyyy:~6,4!
@echo on
7z a -tzip "%%x_!year_file!-!month_file!-!day_file!.zip" "%%x"
7z t "%%x_!year_file!-!month_file!-!day_file!.zip" |>nul find /i "Everything is Ok" && (echo del /q "%%x") || (echo Битый)
@echo off
)

:yesterday
for /f %%i in ("%~1") do set data_modifed=%%~ti
Set day_minus=0
Set yyyy=%data_modifed:~6,4%
Set /A mm=100%data_modifed:~3,2%%%100
Set /A dd=100%data_modifed:~,2%%%100
Set /A JD=%day_minus%+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal& Set ddmmyyyy=%dd:~-2%.%mm:~-2%.%yyyy% Но при работе есть ошибки:
1. Почему то для первых двух файлов дата изменения берется от первого файла, для третьего дата модификации от второго, у четвертого от третьего и так далее.
2. После тестирования не удаляются файлы.

Плюс хотелось бы прикрутить логирование, чтобы видно было какие файлы были обработаны, а какие пропущены.

P.s. Разбираюсь в скриптах не сильно, компоновал на основе других батников.

Falcon99
30-07-2018, 17:27
Ошибки нашел сам. А вот как логирование прикрутить идей нет.

Iska
30-07-2018, 18:18
Не вижу смысла в:
cd "C:\Program Files\7-Zip" »
Просто указывайте полный путь к 7z.exe.

Аналогично с:
После чего тестировать архи, »
После архивирования просто анализируете код возврата 7z.exe:
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

Плюс хотелось бы прикрутить логирование, чтобы видно было какие файлы были обработаны, а какие пропущены. »
А в чём, собственно, проблема-то?

Falcon99
30-07-2018, 18:27
После архивирования просто анализируете код возврата 7z.exe: »
Т.е. вы предлагает не делать тестирование, а анализировать код возврата архиватора?
Просто никогда не работал с ERRORLEVEL и даже не представляю как его делать.
Да и вариант через тестирование делал потому как файлы это бэкапы на NAS и не хотелось бы чтобы потом с ними проблемы были.

А в чём, собственно, проблема-то? »
Просто не представляю по какому принципу делать лог. Т.к. при архивировании выводится куча дополнительной информации которая там не нужна.
Поэтому думаю может брать строчку от теста. Т.е. что-то подобное "путь\файл - ок".

Iska
30-07-2018, 19:41
Т.е. вы предлагает не делать тестирование, а анализировать код возврата архиватора? »
Да.

Просто никогда не работал с ERRORLEVEL и даже не представляю как его делать. »
Проще всего — посредством операторов && и ||, которые присутствуют и в Вашем коде. Например (не проверялось):
@echo off
setlocal enableextensions enabledelayedexpansion

set list=c:\temp\list.txt
set sLog=c:\temp\Log.txt

for /f "usebackq delims=" %%x in ("%list%") do (
call :yesterday "%%x"
set day_file=!ddmmyyyy:~0,2!
set month_file=!ddmmyyyy:~3,2!
set year_file=!ddmmyyyy:~6,4!

"%ProgramFiles%\7-Zip\7z.exe" a -tzip "%%x_!year_file!-!month_file!-!day_file!.zip" "%%x" && (
echo File [%%x] added into archive [%%x_!year_file!-!month_file!-!day_file!.zip] successfully.
>>"%sLog%" echo echo %date:~0,8% %time:~0,8% File [%%x] added into archive [%%x_!year_file!-!month_file!-!day_file!.zip] successfully.
del /q "%%x"
) || (
echo Error occured while creating archive [%%x_!year_file!-!month_file!-!day_file!.zip].
>>"%sLog%" echo echo %date:~0,8% %time:~0,8% Error occured while creating archive [%%x_!year_file!-!month_file!-!day_file!.zip].
)
)

endlocal
exit /b 0

:yesterday
for /f %%i in ("%~1") do set data_modifed=%%~ti
Set day_minus=0
Set yyyy=%data_modifed:~6,4%
Set /A mm=100%data_modifed:~3,2%%%100
Set /A dd=100%data_modifed:~,2%%%100
Set /A JD=%day_minus%+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal& Set ddmmyyyy=%dd:~-2%.%mm:~-2%.%yyyy%
Просто не представляю по какому принципу делать лог. Т.к. при архивировании выводится куча дополнительной информации которая там не нужна.
Поэтому думаю может брать строчку от теста. Т.е. что-то подобное "путь\файл - ок". »
Выделил красным.

Busla
30-07-2018, 20:48
После архивирования просто анализируете код возврата 7z.exe: »
лет с десять назад топ популярных архиаторов (7zip, WinRar, WinZip) положительно рапортовал о создании много-терабайтного архива, который потом не открывался (сходу пруф не нашёл)

ошибки записи проявляются только при чтении

Iska
30-07-2018, 21:18
лет с десять назад топ популярных архиаторов (7zip, WinRar, WinZip) положительно рапортовал о создании много-терабайтного архива, который потом не открывался (сходу пруф не нашёл) »
Всё может быть. Если проблема внутри приложения — естественно, что это не проявится на данном уровне.

ошибки записи проявляются только при чтении »
Я было хотел в своём первом сообщении упомянуть, что тестирование после создания имело место быть во времена дискет и дисков MFM и тогда имело смысл, но не сейчас :lol:.

P.S. В WinRAR, помнится, по сю пору есть вариант «создать архив и сразу его протестировать», но в 7-Zip нету — команды a и t могут применяться только раздельно.




© OSzone.net 2001-2012