6

Я пытаюсь создать резервный скрипт с 7-Zip. Я уже все сделал, но эти две проблемы все еще блокируют меня.

Во-первых, я хочу добавить метку времени с датой создания, например: 3.11.2010 Backup.7z

Итак, формат dd.mm.yyyy . Я перепробовал несколько версий, найденных в интернете, но ни одна из них не работала так, как я хотел. Что я должен делать?

Во-вторых, я хочу добавить только последнюю измененную папку в архив (независимо от того, сколько папок существует в каталоге; мне просто нужна последняя). В принципе, у меня есть что-то вроде этого:

App_v.1.0.0.4.exe_Url_2um2yok5q4vpoxnvnscpq3adfwff4wsmi
App_v.1.0.0.5.exe_Url_ft4mnvbu54hfrgdhxrahj4imlmermdsoe

Поэтому я хочу добавить только самую новую (1.0.0.5) папку. Эти папки меняются и всегда имеют разные имена, поэтому сортировка по именам была бы плохой идеей.

4 ответа4

6
7z a -r "%DATE:~7,2%.%DATE:~4,2%.%DATE:~-4% Backup".7z

Создайте архив с DD.MM.YYYY Backup.7z Format.

Объяснение: Повтор %DATE% печатает дату в региональном формате даты.

D:\>echo %DATE%
Thu 11/04/2010

Используя ~x,y спецификатор, вы делаете извлечение строки в строку / подстроку - где x - начальный символ и y количество символов, которые вы хотите извлечь.

По вашему второму пункту:

Я только хочу добавить последнюю измененную папку в архив (независимо от того, сколько папок существует в каталоге, мне просто нужна последняя).

7z u -r "%DATE:~2,2%.%DATE:~5,2%.%DATE:~-4% Backup".7z 

должен сделать это.

Дата 7zip

1

Вы можете использовать "Инструментарий управления окнами". Увидеть этот

test1.bat:

set mydate=
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x
echo Current date is %mydate%

Результат:

Текущая дата 20140202145547.557000+060

Независимо от ваших "региональных настроек" (формата даты) в "Панели управления" всегда возвращается ГГГГММДД.

0

В командной строке 7zip не будет логики для выполнения нужных вам задач. Если вы работаете в Linux, вам придется выяснить, как это сделать, в вашем сценарии оболочки. Если вы работаете в Windows, вы можете поэкспериментировать с пакетным языком DOS (который МОЖЕТ быть достаточно мощным), powershell (который требует установки чего-либо) или написать файл vbscript (.vbs), который должен быть довольно хорошим решением.

Если вы решите пойти по пути vbs, я рекомендую вам изучить объект файловой системы с vbscript. http://www.devguru.com/technologies/vbscript/14048.asp

0

Что я сделал, чтобы получить файлы, которые изменились в тот день, так это использовать Robocopy для копирования вновь измененных файлов во временный каталог, а затем 7zip.

РЕДАКТИРОВАТЬ:
С самого начала хочу сказать, что я не пакетный ниндзя, но, читая сайты, я смог собрать вместе что-то, что, кажется, работает достаточно хорошо. Я не программист, но я "компьютерный парень", так что я просто знаю больше, чем большинство, с кем я работаю.

Вот сценарий, который я использую. Формат даты отличается от того, о котором вы просили, выбрал ГГГГ-ММ-ДД, потому что тогда все будет хорошо в Windows Explorer. Вы должны быть в состоянии изменить это так, как вы хотите, чтобы вещи были помечены

Часть скрипта /maxage:1 - это то, что ограничивает то, что изменилось за день. Я запускаю скрипт резервного копирования ежедневно.

Одна проблема, которую я не исправил в сценарии, - это то, что если файлы не были изменены, файл 7z размером 32 КБ все еще создается (пустой архив 7z). Я планировал добавить обнаружение пустых каталогов или, если ничего другого, не сделать хеш и сравнить с пустым хешем архива 7z, а если совпадение, то удалить только что созданный пустой архив 7z.

В моем сценарии полного резервного копирования у меня есть сценарий хэширования архива, поэтому я могу вручную сравнить хэши двух последних полных резервных копий, чтобы определить, совпадают ли они. (При наличии такого сценария не будет обнаружено, были ли удалены файлы, потому что при добавочном резервном копировании не будет добавлено ни одного файла.) Если текущий хэш и предыдущий хэш совпадают, я удаляю новейшую резервную копию, потому что с тех пор ничего не изменилось. (Я планировал автоматизировать проверку того, успел ли я.)

Я надеюсь, что очистив скрипт (удалив имена серверов и т.д.), Я не сломал его, и у меня никогда не было много времени, чтобы отладить скрипт, чтобы он был сырым. В любом случае, я надеюсь, что будет достаточно, чтобы начать работу в правильном направлении к сценарию, который будет соответствовать вашим требованиям.

Если вам нужны какие-либо разъяснения по поводу переключателей или почему я выбрал переключатели, которые вы выбрали, не стесняйтесь спрашивать.

rem Setup Variables...
set zcmd="c:\program files\7-zip\7z" a -t7z -r -mx=7 -ssw -mtc=on
set backupdir=C:\_backups\2burn
set tempdir=C:\_backups\temp
rem date format YYYY_MM_DD
set mydate=%date:~10,4%_%date:~4,2%_%date:~7,2%
set rc=c:\robocopy.exe

rem Make Directories...
md %backupdir%\%mydate%
if exist %tempdir% rd %tempdir% /s /q
if not exist %tempdir% md %tempdir%

rem Copy changed files...
%rc% \\server1\source\path %tempdir%\temp\path *.* /s /z /copy:dat /maxage:1 /r:5 /w:5     /log:%backupdir%\%mydate%\log.txt /np

rem Compress changed files...
if exist %tempdir%\temp\path %zcmd% %backupdir%\%mydate%\backup1.7z %tempdir%\temp\path\*.*

rem Remove temp directory...
rd %tempdir%\temp\path\ /q /s

rem copy compressed file and log to offsite server...
%rc% /copy:dat /e /z /r:5 /w:5 %backupdir%\%mydate%  "\\remote_server\share\backup_path\%mydate%"


rem email changed files log from offsite server...
rem C:\blat\blat262\full\blat -subject "BATCH: backup1 inc backup for %mydate%." -bodyf "\\remote_server\share\backup_path\%mydate%\log.txt" -server \\mailserver -f AccountToSendTo -tf c:\ListOfAdmins2Email.txt -u Username -pw Pa$$w0rd

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .