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

Sisin 03-08-2017 15:21 2756035

Несколько резервных копий файла с датами в названии
 
Господа, периодически обнуляется файл настроек от приложения autobackup.bak
(относительный путь profile\autobackup.bak).
Помогите сделать батник, который бы сохранял копии в этой же папке profile следующим образом:
"1. Сохранение 12.06.17.bak"
"2. Сохранение 13.06.17.bak"
"3. Сохранение 14.06.17.bak"
"4. Сохранение 15.06.17.bak"
"5. Сохранение 16.06.17.bak"

При сохранении 6-ой копии копия бы сохранялась как:
"1. Сохранение 17.06.17.bak"
и т.д.

В итоге бы было всегда 5 копий.
Получается, что батник должен заменять самую старую копию на новую.

mwz 03-08-2017 16:54 2756053

Цитата:

Цитата Sisin
"1. Сохранение 12.06.17.bak" »

Цитата:

Цитата Sisin
При сохранении 6-ой копии копия бы сохранялась как:
"1. Сохранение 17.06.17.bak" »

Т.е. требуется удалить самую старую копию, а затем создать новую с тем же номером. Или лучше — наоборот: сначала создать новую, а уж по завершении проверки правильности нового бэкапа удалить старую.

Думаю что отталкиваться надо от этого.

PS
Ну и стандартно неудобный (с точки зрения зрительного анализа и машинного разбора) подход к именованию файлов: ДД.ММ.ГГГГ, вместо предпочтительного ГГГГММДД, при котором файлы даже зрительно располагаются в порядке возрастания дат. А ваши префиксы 1., 2. и т.д. дополнительно затруднят вам работу. Но понимание этого приходит с опытом (иногда хватает пары дней).

megaloman 03-08-2017 17:40 2756065

Sisin, Не вижу логики в указанном Вами способе нумерации.
Вот решение, где самый старый из указанного количества файл будет под номером 1, а самый новый будет всегда иметь не более максимально-возможного указанного Вами номера, например, 5
Код:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set "BoxIn=Z:\Box_In\profile"
Set "FileIn=autobackup.bak"

Set "BakPrefix= Сохранение "
Set "Delim=."
Set "BakExt=bak"
Set "MDate=??.??.??"

Set /A NMax=5

Call :StrDate "Tdate"

Set /A iBak=%NMax%-1
FOR /F "usebackq Skip=%iBak% delims=" %%i in (`Dir "%BoxIn%\*%Delim%%BakPrefix%%Mdate%.%BakExt%" /B /T:C /O:-D 2^>nul`) DO Del "%BoxIn%\%%i"

Set /A iBak=1
FOR /F "usebackq Tokens=1,* delims=%Delim%" %%i in (`Dir "%BoxIn%\*%Delim%%BakPrefix%%Mdate%.%BakExt%" /B /T:C /O:D 2^>nul`) DO Ren "%BoxIn%\%%i%Delim%%%j" "!iBak!%Delim%%%j" &Set /A iBak+=1

Copy "%BoxIn%\%FileIn%" "%BoxIn%\%iBak%%Delim%%BakPrefix%%Tdate%.%BakExt%" >nul
GoTo :Eof

:StrDate
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET @Tdate=%%d
        Set "%~1=%@Tdate:~6,2%.%@Tdate:~4,2%.%@Tdate:~2,2%"
GoTo :Eof

Пусть макс количество копий =5. Батник удаляет старые копии, оставляет 4 самые свежие (если они есть), переименовывает оставшиеся в соответствии с нумерацией 1,2,3 ... и создаёт копию с максимальным номером, не более 5.
То есть, если по началу копий вообще нет, получим номер 1, если есть 3 старые копии, новая будет с номером 4. Если есть 5 копий, удалим первую, останутся 2,3,4,5, переименуем их в 1,2,3,4 и новая будет с номером 5
Я бы вообще предпочел не нумеровать копии 1,2,3 ... ИМХО, выгоднее делать в таком виде:
ггггммдд_ччмнссдс_имяфайла, например: 20170612_134558_autobackup.bak


Время: 13:09.

Время: 13:09.
© OSzone.net 2001-