7-Zip CMD: добавить текущую дату в архив и включить в архив только последнюю измененную папку
Я пытаюсь создать резервный скрипт с 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) папку. Эти папки меняются и всегда имеют разные имена, поэтому сортировка по именам будет плохой идеей.
5 ответов
7z a -r "%DATE:~7,2%.%DATE:~4,2%.%DATE:~-4% Backup".7z
Создам архив с DD.MM.YYYY Backup.7z
Формат.
Пояснение: повторение %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
должен сделать это.
Вы можете использовать "Инструментарий управления окнами". Увидеть этот
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
Независимо от ваших "региональных настроек" (формата даты) в "Панели управления" всегда возвращается ГГГГММДД.
В командной строке 7zip не будет логики для выполнения нужных вам задач. Если вы работаете в Linux, вам придется выяснить, как это сделать, в вашем сценарии оболочки. Если вы работаете в Windows, вы можете поэкспериментировать с пакетным языком DOS (который МОЖЕТ быть достаточно мощным), powershell (который требует установки чего-либо) или написать файл vbscript (.vbs), который должен быть довольно хорошим решением.
Если вы решите пойти по пути vbs, я рекомендую вам изучить объект файловой системы с vbscript. http://www.devguru.com/technologies/vbscript/14048.asp
Что я сделал, чтобы получить файлы, которые изменились в тот день, так это использовать Robocopy для копирования вновь измененных файлов во временный каталог, а затем 7zip.
РЕДАКТИРОВАТЬ:
С самого начала хочу сказать, что я не пакетный ниндзя, но, читая сайты, я смог собрать вместе что-то, что, кажется, работает достаточно хорошо. Я не программист, но я "компьютерный парень", так что я просто знаю больше, чем большинство, с кем я работаю.
Вот сценарий, который я использую. Формат даты отличается от того, о котором вы просили, выбрал YYYY-MM-DD, потому что тогда все будет хорошо в 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
У меня есть более простое решение:
7z a "%DATE%_%TIME:~0,2%.%TIME:~3,2%_Backup.7z" c:\test
Выход:
17.03.2019_18.43_Backup.7z