Stanley5, У Вас целый роман при описании постановки задачи
Цитата:
дополнить батник, а возможно и переделать совсем и оптимизировать.
|
Я бы предложил не копировать исходные файлы старше нужного числа дней как они есть, а архивировать в архив в один файл с именем - датой в формате yyyymmdd, с такими названиями файлы легко сортируются. При этом используя ключи winrar этого можно легко добиться. И, далее, удалять в архивной папке не файлы старше определённой даты (например, 20 дней), а оставлять нужное число архивов (например, 20 штук), что, в принципе, при ежедневном создании архивов, одно и то же. Получилось громоздко, но довольно универсально. Степень сжатия rar можно регулировать при необходимости экономии времени при работе ключом -m. В примере я взял -m1 (довольно быстрая работа). Еще быстрее -m0 без сжатия. Без указания работает уровень m3.
Вот код
Код:

@Echo Off
CLS
rem chcp 1251 >nul
SetLocal EnableDelayedExpansion
Set "ARC=%ProgramFiles%\winrar\winrar.exe"
Set "FTmp=%Tmp%\~tmp.tmp"
Call :Arc_Copy "W:\Scan_Buh","W:\EverybodyOld\Scan_Buh",3,20
Call :Arc_Copy "E:\Delete\CMD\JS_Host","E:\Arhiv\JS_Host",3,20,No_JS_Host
Call :Arc_Copy "w:\test","w:\arhiv\test",3,20,No_test
GoTo :Eof
:Arc_Copy
rem %1 Корневая папка откуда архиваруем (с удалением исходных) файлы
rem %2 Папка куда архивируем файлы
rem %3 Архивируем файлы старше этого кол-ва дней под
rem %4 Сколько архивов храним в архивной папке
rem %5 При наличии исключений имя процедуры где формируется файл с исключениями
Call :FromNow -%3 %Date%
Md "%~2" 2>nul
Echo ------ %Date% -%3 %yyyymmdd%
If Exist "%~1" (Echo %1) Else (Echo Не найдено %1 & GoTo :Eof)
If Exist "%~2" (Echo %2) Else (Echo Не найдено %2 & GoTo :Eof)
If '%5'=='' (
"%ARC%" a -r -df -m1 -tb%yyyymmdd%0000 "%~2\%yyyymmdd%" "%~1\*.*"
) Else (
Call :%5 "%~1"
"%ARC%" a -r -df -m1 -tb%yyyymmdd%0000 -x@"%FTmp%" "%~2\%yyyymmdd%" "%~1\*.*"
Del "%FTmp%" >nul 2>nul
)
FOR /F "usebackq Skip=%4 delims=" %%i IN (`Dir "%~2\*.rar" /b /a:-d /O:-N 2^>nuL`) DO del "%~2\%%i"
GoTo :Eof
:No_JS_Host
rem %1 -корневая папка исходных файлов
rem во временный текстовый файл пишем папки (файлы) исключений
Echo>"%FTmp%" %~1\Дискета_от_книги\*.*
Echo>>"%FTmp%" %~1\Из_интернета\Основы WSH\*.*
Echo>>"%FTmp%" %~1\Отлажено\*.*
GoTo:Eof
:No_test
Echo>"%FTmp%" %~1\2\*.*
Echo>>"%FTmp%" %~1\4\*.*
Echo>>"%FTmp%" %~1\5\*.*
GoTo:Eof
:FromNow
rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd
rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date%
rem результат в перемменной %yyyymmdd%
SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+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 yyyymmdd=%yyyy%%mm:~-2%%dd:~-2%
GoTo :Eof
Здесь некоторые пояснения
Процедура архивации Call :Arc_Copy вызывается для каждой архивируемой папки.
Её аргументы описаны.
При наличии исключений в аргументах этой процедуры указывается имя процедуры, где формируется текстовый файл для конкретного случая с перечислением полных имён папок (файлов) исключений.
В примере это процедуры No_JS_Host и No_test