Так как я не был знаком с синтаксисом bat, за поисками я отправился к google и к cmd help. Попробовал написать простенький скрипт записывающий имя целевого диска и меняющий текущий диск на целевой:
SET DRIVEFROM = M:
%DRIVEFROM%
Не работает, думал может быть проблема в скрипте и я что-то не так понял. Оказалось мое "вежливое программирование" подвело меня, после "=" не должно быть пробелов.Дальше так:
- Архивировать папку
- Удалить более старые версии архивов
SET CURDATE=%date:~-4%-%date:~-7,2%-%date:~-10,2%
как видим работаем словно со строками
отлично, теперь можно архивировать
"c:\program files\7-zip\7z" a -r -ssw -tzip -mx5 -x!*.cdx %PATHTO%\%NAMEFILE%%CURDATE% %PATHFROM%\*.*
Здесь:
a - добавить в архив
-r - рекурсивно (вместе с каталогами)
-ssw - копировать открытые на чтение
-tzip - тип архива zip
-mx5 - тип сжатия x5 близка к предельному
-x!*.cdx - пропускать cdx файлы (1с хранит индексы в них)
-i - использовать файл-лист
-w - где разместить временные файлы
Ну и осталось почистить старые файлы. Сначала мы должны выяснить нижнюю границу:
вот тут я нашел как это сделать при помощи VBScript, конечно же можно было создать другой bat-файл который вычитает нужное количество дней из текущего, но мне показалось это слишком громоздким.
получаем дату следующим образом:
в файл "getDate.vbs" запишем
wscript.echo date-30
теперь получить дату можно с помощью:
FOR /F %%A IN ('cscript tmp.vbs //Nologo') DO SET "OLDDATE=%%A"
очищаем старые файлы:
%DRIVE2%
CD %PATHTO%
FOR %%P IN (*.*) DO (
IF /I %NAMEFILE%%OLDDATE%.zip GTR %%P del %%P
)
ECHO backup succesfuly created
ECHO on
Все, осталось только забросить файл в менеджер задач и запускать его по расписанию.
Вот полный лист программы:
Файл getDate.vbs
wscript.echo date-30
файл backup.bat
ECHO off
rem DRIVE1 это диск откуда копирую
SET DRIVE1=%1
rem DRIVE2 это диск куда копирую
SET DRIVE2=%2
rem PATHFROM папка которую архивируем
SET PATHFROM=%DRIVE1%\Paradis
rem PATHTO папка куда архивируем
SET PATHTO=%DRIVE2%
SET NAMEFILE=%3
SET CURDATE=%date:~-4%-%date:~-7,2%-%date:~-10,2%
FOR /F %%A IN ('cscript getDate.vbs //Nologo') DO SET "OLDDATE=%%A"
rem меняем диск, чтобы проверить вобще есть ли тот каталог который нужно архивировать
%DRIVE1%
rem собственно проверка
IF NOT EXIST %PATHFROM% (
ECHO directory "%PATHFROM%" not found
pause
EXIT 1
)
rem меняем диск, на диск назначения
%DRIVE2%
rem проверяем наличие каталога сохранения, если нет то создаем
IF NOT EXIST %PATHTO% md %PATHTO%
rem меняем диск, и создаем копию
%DRIVE1%
"c:\program files\7-zip\7z" a -r -ssw -tzip -mx5 -x!*.cdx %PATHTO%\%NAMEFILE%%CURDATE% %PATHFROM%\*.*
rem если по каким-то причинам не удалось создать файл выходим громко ругаясь
IF NOT EXIST %PATHTO%\%NAMEFILE%%CURDATE%.zip (
ECHO copy not created!!!
pause
exit 1
)
rem удаляем файлы старше 1 месяца
%DRIVE2%
CD %PATHTO%
FOR %%P IN (*.*) DO (
IF /I %NAMEFILE%%OLDDATE%.zip GTR %%P del %%P
)
echo backup succesfuly created
Как написал Dron можно сделать так:
%run_7z% a %baseArch% -w%tmpDir% -ir@%IncludeList% -ssw -slp -mmt=on -mx3 -ms=off -scsWIN %file_save% >> %Log%
PS: немного позже я разобрался как эту же операцию выполнить при помощи VBScript, но статью я уже начал писать, и бросать не хотелось.
PSS: Спустя почти три месяца, я вновь вернулся к данной проблеме, на этот раз нужно сохранять базу данных postgresql и папку upload мегаплана.
скрипт практически не менял.
Познавательная статья. Причуды консольного интерпритатора windows всегда развлекали. Вот помню в молодости писал на батниках интреактивные приложения, которые чего-то у пользователя выпытывали :). Эх времена были. А для бекапа в винде есть стандартный инструмент.. ну это я так помню. Ему задаёшь файлы, расписание, он и бекапит :) или путаю что-то?
ОтветитьУдалитьЭм :) и ещё ежели по существу :) надо пусть до 7z вынести в отдельную переменную, объявляемую в начале скрипта, просто для удобства - а вдруг в другое место переставишь? да и проверять нужно. стоит этот самы архиватор или нет.
ОтветитьУдалитьналичие архиватора предпологается.
ОтветитьУдалитьможно и в переменную вынести. Скрипт писался под конкретную машину, для конкретной задачи. Скоро возможно на VBS перепишу (в конечном счете оказалось что необходимо архивировать не одну базу, а целый список)
да в винде есть какая-то система для архивирования (воспоминания курса "администрирование" подсказывает), но как ты помнишь он делает backup полностью всей системы на которых стоит метка "Архивный", или я что-то путаю.
нет, Сергей ты ошибаешься. Виндовый ntbackup может делать бэкап тех файлов которые ты укажешь.
ОтветитьУдалитьИммет интерфейс командной строки. У меня на работе он достаточно эффективно справляется со своими обязанностями. Бэкапит около 500ГБ за месяц. Я пользуюсь связкой ntbackup + nncron как шедулер.
ну вот, можно удалять пост :(
ОтветитьУдалитьдаже при необходимости файлы посмотреть можно
с появлением windows server 2008 тема вновь актуальна - там резервное копирование отдельных файлов отсутствует
ОтветитьУдалитьура :)
ОтветитьУдалитьно ничего ведь не мешает установить ntbackup на 2008?
честно говоря, никто не мешает и Symantec Backup exec поставить :)
ОтветитьУдалитьКстати! у 7zip есть параметр -i@ после которого можно вставить файл со списком того, что нужно забэкапить. +сделать лог и уже готовый backup :)
ну вот :) еще проще, когда разбирался, поленился прочитать все параметры 7z.
ОтветитьУдалитьПроверил вариант:
7z a -r -ssw -tzip -mx5 -i@list.txt back.zip
работает, в list.txt: back\*.*
я навернул чуть круче :)
ОтветитьУдалить%run_7z% a %baseArch% -w%tmpDir% -ir@%IncludeList% -ssw -slp -mmt=on -mx3 -ms=off -scsWIN >> %Log%
соответственно, все параметры задаются переменными
указываешь куда писать логи, откуда, куда, где временные файлы размещать
хм... неплохо надо записать, спасибо
ОтветитьУдалитьи еще кое-что я понял, для каждого случая будет свой скрипт.
ОтветитьУдалитья попытался написать универсальный скрипт, к сожалению у меня это получилось только для баз 1С
Для базы мегаплана мне необходимо создавать сначала дамп базы postgres а затем уже закидывать его в общий backup