Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 06-12-2015 в 15:42.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:54, 05-12-2015 | #2