Войти

Показать полную графическую версию : [решено] Помогите правильно сделать апдейт архива 7zip (аналог функции RAR)


blacks2
24-11-2020, 22:38
Здравствуйте.
Помогите пожалуйста: "Помогите правильно сделать апдейт архива 7zip (аналог функции RAR)"


Хотел сделать функцию которая есть в RAR:
- при создании архива, не сжимать определенные группы файлов/расширений.

Создание архива с исключениями - ОК.

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


Заранее всем откликнувшимся большое спасибо!




PS
справку 7zip читал - моим мозгам не помогло
https://sevenzip.osdn.jp/chm/cmdline/switches/update.htm

@ECHO OFF

:: удаляем старый архив
del c:\tempXtoo\zip.7z
echo OK (delit)
echo. & echo.
cls

:: создаем новый, исключив определенные расширения файлов (указаны в списке exclusions_01_zip.lst)
:: сжатие = 3 уровня
7za a -mx3 -r0 "c:\tempXtoo\zip.7z" "c:\tempXsrc" -x@exclusions_01_zip.lst
echo. &echo.
echo OK (-jpg -png...)
pause
cls

:: добавляем в созданный архив, файлы которые не были добавлены / по списку-расширений
:: с сжатием = 0 уровня
:: 7za a -mx0 -r0 -i@exclusions_01_zip.lst "c:\tempXtoo\zip.7z" "c:\tempXsrc\"
:: 7za a -mx0 -r0 -ir@exclusions_01_zip.lst "c:\tempXtoo\zip.7z" "c:\tempXsrc\"
:: 7za u -mx0 -r0 -u!"c:\tempXtoo\zip.7z" "c:\tempXsrc\"
:: 7za u -mx0 -ur2!"c:\tempXtoo\zip.7z" "c:\tempXsrc\"
echo. & echo.
echo OK (update)
pause
cls

echo. & echo.
echo fin
pause

Iska
25-11-2020, 01:08
Общий принцип:
@echo off
setlocal enableextensions disabledelayedexpansion

set sArcName=C:\Мои проекты\0326\Sample.7z

pushd "C:\Мои проекты\0326\Source" && (
"C:\Program Files\7-Zip\7za.exe" a "%sArcName%" -mx3 -xr!*.png -xr!*.jpg
"C:\Program Files\7-Zip\7za.exe" a "%sArcName%" -mx0 -ir!*.png -ir!*.jpg
)

endlocal
exit /b 0

blacks2
25-11-2020, 02:21
Общий принцип: »

Спасибо.
Попробовал - стало лучше, но не совсем:


2 варианта:
7za.exe a "c:\tempXtoo\zip.7z" "c:\tempXsrc\" -mx0 -ir!exclusions_01_zip.lst
7za.exe a "c:\tempXtoo\zip.7z" "c:\tempXsrc\" -mx0 -i!exclusions_01_zip.lst
(-ir! или -i!)

оба варианта добавляют исключенные файлы по расширению - хорошо
но добавляет и файл exclusions_01_zip.lst внутрь архива
- видимо что-то не то...
- подскажите пожалуйста что опять не правильно?

Iska
25-11-2020, 02:46
но добавляет и файл exclusions_01_zip.lst внутрь архива »
Зачем Вы его держите внутри того каталога, который архивируете? Это называется ССЗБ.

Второе:
-i[<recurse_type>]<file_ref>

<recurse_type> ::= r[- | 0]
<file_ref> ::= @{listfile} | !{wildcard}


listfile должен предваряться символом «@», а не «!». А так Вы закономерно получаете внутри архива ровно то, что и запросили.

sov44
25-11-2020, 07:02
blacks2, -mx0 = копирование без сжатия. Так и задумано? Без этого ключа будет применено значение по умолчанию (-mx5).
По умолчанию 7-Zip пытается прочесть файл-список в кодировке UTF-8, но вы можете использовать и иную кодировку, указав её ключом -scs .
Множественные файл-списки поддержаны.
7z a archive.7z @listfile.txt -scs1251

Iska
25-11-2020, 08:52
blacks2, -mx0 = копирование без сжатия. Так и задумано? »
Да. Особого смысла жать jpg/png и т.п. — нет. Как Вам такое:
https://i.imgur.com/lRNAd06.png
;)?!

megaloman
25-11-2020, 20:33
blacks2, но добавляет и файл exclusions_01_zip.lst внутрь архива »А что, если совсем без "exclusions_01_zip.lst", как с идеей Iska@Echo Off
cls
Set "BoxIn=D:\CMD_Forum"
Set "ArcOut=D:\Delete\testzip"

Set "Exc3=*.bat *.vbs *.js *.mp3 *.xls* *.png"
Set "Add0=*.mp3 *.xls*"

Set Arc="C:\Program Files\7-Zip\7z.exe"

pushd "%BoxIn%" &&(
%Arc% u -mx3 -r0 -xr!%Exc3: = -xr!% "%ArcOut%"
%Arc% u -mx0 -r0 -ir!%Add0: = -ir!% "%ArcOut%"
)
Pause
Exit /BЕстественно можно сделать список исключений и список вторичного добавления одинаковым

Set "Add0=%Exc3%"@Echo Off
cls
Set "BoxIn=D:\CMD_Forum"
Set "ArcOut=D:\Delete\testzip1"

Set "Exc3="*.bat" "*.vbs" "*.js" "?? * *.mp3" "*.xls*" "*.png""
Set "Add0="?? * *.mp3" "*.xls*""

Set Arc="C:\Program Files\7-Zip\7z.exe"

pushd "%BoxIn%" &&(
%Arc% u -mx3 -r0 -xr!%Exc3:" "=" -xr!"% "%ArcOut%"
%Arc% u -mx0 -r0 -ir!%Add0:" "=" -ir!"% "%ArcOut%"
)
Pause
Exit /B

blacks2
27-11-2020, 00:32
Зачем Вы его держите внутри того каталога, который архивируете? »
Даже не думал об этом :o
Всё в разных!

go_to_archiv.cmd + exclusions_01_zip.lst
- лежат рядом, вместе на диске x:\some\rnd\

файлы для архивации и zip
- "c:\tempXtoo\zip.7z" "c:\tempXsrc"



listfile должен предваряться символом «@», а не «!» »
Спасибо. Пробовал так и сяк:
-ir@exclusions_01_zip.lst
-i@exclusions_01_zip.lst

исключенные расширения добавились - ОК
exclusions_01_zip.lst - не добавился - ОК

Но.. на этот раз добавились...
ненужные архивы лежащие рядом с исполняющим go_to_archiv.cmd (тестовая папка арихваторов)
pigz_Windows.zip
pigz_Windows_CloudFlareZlib.zip


Что-то опять пошло не так.
Что делать - не понимаю ((

В обоих случаях добавлялся файл в котором присутствовало слово или расширение "zip".
Которое указанно первым в списке исключений

Можно конечно просто убрать из папки исполняющим CMD
- файлы pigz_Windows.zip и pigz_Windows_CloudFlareZlib.zip (тогда все работает ОК)
- но вдруг, в папке с исполняющим CMD появится файл с "zip" или другой какой с расширением записанным в списке исключений (картинка, pdf) - они могут добавиться в архив...

Глянул еще раз список exclusions_01_zip.lst - вроде все норм.
Даже попробовал в одну строку - результат не рабочий...

*.zip
*.7z
*.rar
*.gzip
*.tar
*.arj
*.iso
*.djvu
*.epub
*.jpg
*.jpeg
*.jp2
*.png
*.gif
*.webp
*.avi
*.mp4
*.mkv
*.mpeg
*.mpg
*.avi
*.wmv
*.flv
*.mp3
*.flac
*.ogg
*.3gp
*.ape
*.aac
*.asf
*.amr
*.wma
*.000
*.001
*.002
*.003
*.004
*.005
*.006
*.007
*.008
*.009
*.010
*.011
*.012
*.013





PS
Хм, а вот megaloman предлагает -ir!% "%ArcOut%" :not-me:
посмотрел, да и вы ранее в варианте с pushd также предлагали :happy:

"Да. Особого смысла жать jpg/png и т.п. — нет. Как Вам такое:"
потому мне и захотелось 7zip для тестов-прогонов так настроить.
А не получается...

* Iska, картинка гениальная! :jester:
правда мои pdf печатного качества наоборот жмутся влёт: 300мб в 35-80Мб
просто большинство pdf офис док-текст /или сжаты для веба - плохо и жмутся.
всё зависит от настроек вывода pdf из софта - качество pdf)




А что, если совсем без "exclusions_01_zip.lst", как с идеей Iska post=2941026]»[/post]
megaloman попробвал ваш пример - работает
ничего лишнего не добавляет - гуд

только создаваемый архив не имеет имени, просто ".zip" (делал через 7za.exe)
назначить имя файлу не понял как 0:)



Далее
решил попробовать так в своем cmd:
a -ssw -mx9 -r0 -xr@exclusions_01_zip.lst
u -ssw -mx0 -r0 -i@exclusions_01_zip.lst
(изменил а на u)

- работает!
- НО.. как писал выше, при обновлении архива, добавляются pigz_Windows.zip, pigz_Windows_CloudFlareZlib.zip лежащие рядом с исполняющим CMD
- ...походу особенности 7zip или что-то не то с exclusions_01_zip.lst (там указан формат *.zip)

Не понимаю...
"Оформление"-способ скрипта все же хотелось оставить свой прежний, нежели PUSHD
так как мне более понятный и в общем концепте выглядит гармонично
(всё сделано молотком, а тут что-то изящное и не понятное =) )

Но не получается!
Не понимаю!
:clapping:
почему добавляются zip..
и возможные дальнейшие конфликты с другими файлами




OFF
Если в масках возможны пробелы, то »
правильно ли я понял / ошибаюсь:

"?? * *.mp3"
- файл вида "маша - бла бла бла.mp3"
- разве *.mp3 недостаточно?
- простите за вопрос, просто ранее таких конструкций не видел, потому смутился =)


А что, если совсем без "exclusions_01_zip.lst", как с идеей Iska »
просто:
я новичок в cmd, не программист - изредка собираю что-то для домашнего парка на заплатках-сниппетах и полученном ранее опыте.
потому конструкция в топике мне проще и понятней, а на несколько ступенек выше еще не перешел.
плюс стандартный вопрос новичка: когда делаешь шаг на новую ступень, твое положение шатко и возможны конфликты в коде =)

вместо 3d принтера... молоток+гвоздь
PUSHD`ом пока не проникся...

megaloman
27-11-2020, 14:19
назначить имя файлу не понял как .... только создаваемый архив не имеет имени, просто ".zip» Покажите Ваш вариант моего батника.
Set "ArcOut=D:\Delete\testzip" »Имя файла прописывается здесь. В моём примере архив будет иметь имя testzip.7Z"?? * *.mp3"
- файл вида "маша - бла бла бла.mp3"
- разве *.mp3 недостаточно? » Вполне достаточно, если у вас простая маска *.mp3, а если надо более сложная маска, с пробелами внутри, то вариант для этого я Вам выдал тоже.
И, раз такая пьянка, если Вы разделяете файлы только по расширению, то список можно сделать проще, убрать из списка *. и оставить только расширения:@Echo Off
cls
Set "BoxIn=D:\CMD_Forum"
Set "ArcOut=D:\Delete\testzip"

Set "Exc3=bat vbs js mp3 xls* png"
Set "Add0=mp3 xls*"

Set Arc="C:\Program Files\7-Zip\7z.exe"

pushd "%BoxIn%" &&(
%Arc% u -mx3 -r0 -xr!*.%Exc3: = -xr!*.% "%ArcOut%"
%Arc% u -mx0 -r0 -ir!*.%Add0: = -ir!*.% "%ArcOut%"
)
Pause
Exit /B

blacks2
28-11-2020, 08:25
И, раз такая пьянка, »

Последний приведенный вами пример работает,
И без всяких лишних добавлений лишних файлов.
Спасибо!



1.
Насколько понимаю всё "выполняется из" %BoxIn% - вне папки исполняющего cmd
Поэтому ничего лишнего не подхватывается =)

Странно что предыдущий пример не работал.
Вроде по концепту они схожи.
Моей копии, о которой вы спросили не сохранилось.
Создал новую, новая вообще не исключает файлы по расширению =)

Но, наверное, уже не в ней суть - последняя версия сработала.
@Echo Off

Set "BoxIn=c:\tempXsrc"
Set "ArcOut=c:\tempXtoo\testzip"

Set "Exc3=*.zip *.bat *.vbs *.js *.mp3 *.xls* *.png *.jpg *.jpeg"
Set "Add0=%Exc3%"

Set Arc="%~dp07za.exe"

:: удаляем старый архив
del c:\tempXtoo\testzip.7z
cls

pushd "%BoxIn%" &&(
%Arc% u -mx3 -r0 -xr!%Exc3: = -xr!% "%ArcOut%"
%Arc% u -mx0 -r0 -ir!%Add0: = -ir!% "%ArcOut%"
)

echo OK all
Pause

Exit /B


2.
Добавив ваш пример в сборку с своими переменным
- При старте cmd просто вылетает

Попытка вставить в сборку ваш чистый пример скрипта (без моих переменных)
выдается ошибка Command Line Error: Incorrect wildcard type marker


Сборка cmd построена на вашем megaloman совете-примере точного определения времени в виде cmd-javascript. ( http://forum.oszone.net/post-2940716-8.html )
- добавлял прямяком заменой "rem === здесь код, время исполнения которого контролируем"

Видимо в чем-то конфликт...
Та сама ступенька новика о которой недавно писал :).


Вычислить и исправить баг/кривые свои руки, я самостоятельно не могу.
Видно лишь то, что походу срабатывает прям на строке "pushd "%src_bkup%" &&(...."


Развивать данный топик на тему "спасибо за помощь, а теперь разберите почему не работает с моим"...
- думаю неуважение к вам megaloman и к форуму

Поэтому наверное мне придется остаться при "баранах"
7za par1=a -ssw -mx3 -r0 -xr@exclusions_01_zip.lst -mhc=on -mhe=on "%destination%\zip.7z" "%src_bkup%\"
7za par2=u -ssw -mx0 -r0 -i@exclusions_01_zip.lst -mhc=on -mhe=on "%destination%\zip.7z" "%src_bkup%\"
хоть они и "подхватывают" zip рядом с исполняющим файлом(



* 7za.exe хранится рядом с исполняющим cmd
а сама вся та папка, плавает в разных местах диска/флешки

Поэтому добавил такую строчку (вроде работает):
Set Arc="%~dp07za.exe"

Iska
28-11-2020, 10:58
И всё же, без pushd, Вы никак не получите потребный функционал. Это не WinRAR, тут нет возможностей по манипуляции со включениями/исключениями путей (и их частей) в содержимое архива, как в WinRAR'е. Причём, только на моей памяти Игоря несколько раз просили расширить функционал 7-Zip в этом направлении, но он всякий раз отказывался.

blacks2
29-11-2020, 08:56
И всё же, без pushd, Вы никак не получите потребный функционал. »
Спасибо за совет Iska.
Буду порой долбить себе мозг в то направление.

Да, по той причине и решил попробовать прогнать по тестам-сравнениям в вариант с update
Правда знаний как в cmd то собрать - не хватило...

Про Игоря... думаю причина в логике:
- если просто жать - тебе не интересны исключения - бытовой уровень и ок.
- если хорошо жать - тогда тебе нужны solid архивы
- а solid + исключения + словарь = скорее всего не вяжутся логически в алгоритмах/время затратах
- ...тогда если "нужно хорошо жать" = жми все и максимум возможно =)




© OSzone.net 2001-2012