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 

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

Дата 7zip

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

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

Другие вопросы по тегам