Компьютерный форум 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=335938)

Falcon99 30-07-2018 17:22 2824040

Некорректно отрабатывает скрипт, помогите найти ошибку.
 
Не могу понять почему некорректно отрабатывает скрипт.
Скрипт должен брать из списка название файла. Потом упаковывать есть в 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 2824042

Ошибки нашел сам. А вот как логирование прикрутить идей нет.

Iska 30-07-2018 18:18 2824047

Не вижу смысла в:
Цитата:

Цитата Falcon99
cd "C:\Program Files\7-Zip" »

Просто указывайте полный путь к 7z.exe.

Аналогично с:
Цитата:

Цитата Falcon99
После чего тестировать архи, »

После архивирования просто анализируете код возврата 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
Плюс хотелось бы прикрутить логирование, чтобы видно было какие файлы были обработаны, а какие пропущены. »

А в чём, собственно, проблема-то?

Falcon99 30-07-2018 18:27 2824048

Цитата:

Цитата Iska
После архивирования просто анализируете код возврата 7z.exe: »

Т.е. вы предлагает не делать тестирование, а анализировать код возврата архиватора?
Просто никогда не работал с ERRORLEVEL и даже не представляю как его делать.
Да и вариант через тестирование делал потому как файлы это бэкапы на NAS и не хотелось бы чтобы потом с ними проблемы были.

Цитата:

Цитата Iska
А в чём, собственно, проблема-то? »

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

Iska 30-07-2018 19:41 2824057

Цитата:

Цитата Falcon99
Т.е. вы предлагает не делать тестирование, а анализировать код возврата архиватора? »

Да.

Цитата:

Цитата Falcon99
Просто никогда не работал с 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%


Цитата:

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

Выделил красным.

Busla 30-07-2018 20:48 2824068

Цитата:

Цитата Iska
После архивирования просто анализируете код возврата 7z.exe: »

лет с десять назад топ популярных архиаторов (7zip, WinRar, WinZip) положительно рапортовал о создании много-терабайтного архива, который потом не открывался (сходу пруф не нашёл)

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

Iska 30-07-2018 21:18 2824078

Цитата:

Цитата Busla
лет с десять назад топ популярных архиаторов (7zip, WinRar, WinZip) положительно рапортовал о создании много-терабайтного архива, который потом не открывался (сходу пруф не нашёл) »

Всё может быть. Если проблема внутри приложения — естественно, что это не проявится на данном уровне.

Цитата:

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

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

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


Время: 22:24.

Время: 22:24.
© OSzone.net 2001-