Вы должны войти, чтобы создавать сообщения и темы.

7zUltra_recompressor - батник для автоматической перепаковки ваших архивов (zip, rar, 7z) в 7z с маскимальным сжатием

Страница 1 из 4► 4

Добрый день,

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

Описание:
Сделал три уровня сжатия на выбор: Normal, High, Ultra. Всё это стандартные настройки 7zip и танцы с дополнительными функциями я не использовал, т.к. на сегодняшний момент 7zip 24.09 использует достаточно продвинутые настройки и менять их - особого прироста сжатия не дает (дает только прирост времени кодирования).

Работает так:
Переносим в батник на диск или папку где лежат все интересующие нас архивы.
Батник работает только вглубь (вместе с подкаталогами) обрабатывая каждый архив zip, rar, 7z
Создает временные папки с файлами и удаляет их. Получившиеся архивы 7z замещают старые архивы.
Есть на выбор три степени компрессии.
В конце подсчет времени работы.

Батник:

@ECHO OFF
COLOR 71
REM 7zUltra_recompressor - find all .zip, .rar, .7z files in the current directory and subfolders, recompress them into 7zip files - then delete the originals.

:menu1
ECHO.
ECHO Choose compression level:
ECHO.
ECHO 1 - Normal (LZMA2:25)
ECHO 2 - High   (LZMA2:27)
ECHO 3 - Ultra  (LZMA2:28)
ECHO.
SET /p 7zlevel="Press number: "
IF "%7zlevel%"=="1" (
SET "x=-mx=5"
SET "y=Normal"
)
IF "%7zlevel%"=="2" (
SET "x=-mx=7"
SET "y=High"
)
IF "%7zlevel%"=="3" (
SET "x=-mx=9"
SET "y=Ultra"
)
if not defined 7zlevel goto menu1

REM Start time counting
SET StartTime=%time:~-0,8%
SET StTi0=%StartTime: =0%

SET ROOTDIR=%CD%

ECHO.
ECHO Searching for 7z, RAR and ZIP files to recompress into 7zip %y%...
for /R "%ROOTDIR%" %%F in (*.7z *.rar *.zip) do (
REM Set file attribute to "read+write"
ATTRIB -R "%%F"
ECHO Found %%F to recompress...
REM Extract archive to folder "contents"
"C:\Program Files\7-Zip\7z" x "%%F" -o"%%F contents"
REM Does 7zip created the folder correctly?
IF EXIST "%%~fF contents" (
REM Change directory for 7zip
CD "%%~fF contents"
"C:\Program Files\7-Zip\7z" a -t7z "../%%~nF.7z" * %x%
CD "%ROOTDIR%"
REM Delete the temporary "contents" folder
RMDIR "%%~fF contents" /S /Q
ECHO.
ECHO Searching for old RAR and ZIP files to delete...
for /R "%ROOTDIR%" %%F in (*.rar *.zip) do (
ECHO Found %%F to possibly delete...
REM Check old archive
IF EXIST "%%~pnF.7z" (
REM Found copy - delete the old archive
DEL "%%F" /F /Q
ECHO Found %%~pnF.7z so can delete %%F. Deleted.
) ELSE (
ECHO Cannot delete %%F, no %%~pnF.7z file found.
)
)
ECHO Search ended.
ECHO Recompressed %%F to %%~nF.7z (%y%)
)
)
REM Finish time counting
SET FinishTime=%time:~-0,8%
SET FiTi0=%FinishTime: =0%
REM Calculating time in hh:mm:ss format - send seconds 
setlocal enabledelayedexpansion
call:timecalc %StTi0% StT
call:timecalc %FiTi0% FiT
call:difference %StT% %FiT%
ECHO.
ECHO All done. Wasted time: %d%
endlocal
pause
EXIT
REM Seconds serialize
:timecalc
SET "x=%~1"
SET /a "%2=%x:~0,2%*3600+%x:~3,2%*60+%x:~6,2%"
EXIT /b
REM Seconds deserialize
:difference
SET /a "d=%~2-%~1"
SET /a "hh=d/3600","mm=d/60%%60","ss=d%%60"
SET "d="
for %%i in (%hh% %mm% %ss%) do (
    if %%i lss 10 (set "d=!d!0%%i:") else (set "d=!d!%%i:"))
SET "d=!d:~,-1!"
EXIT /b
pause

Прошу посмотреть опытных программистов с оценкой и правкой.
Есть следуюшие проблемы:

  • В меню выбора не влозвращает обратно при выборе неверного значения
  • Не выводит значение %y%

Понимаю что давно этим не занимался - скорее всего где-то банальные проблемы с синтакисисом или логикой.
Версия пробная! Использовать только для тестирования!

Лайкнули 𝐅𝐫𝐨𝐦𝐇𝐞𝐥𝐥, syfle и ещё 4
𝐅𝐫𝐨𝐦𝐇𝐞𝐥𝐥syfleЛатукАликМаркизDamir

Благодаря напутствиям и попутному ветру немного довел до ума...

Исправил:

  • всякие детские ошибки в коде
  • теперь меню работает как надо
  • меньше сервисной информации в окне вывода
  • добавил проверку на установленный 7zip (рекомедуется 16.04 и выше)
  • работает как с x64 так и x86

7zUltra_recompressor_beta2.bat

@ECHO OFF
COLOR 71
title 7zUltra_recompressor
REM 7zUltra_recompressor_beta2 - find all .zip, .rar, .7z files in the current directory and subfolders, recompress them into 7zip with chosen compression level - then delete the originals.
REM Need to install latest version of 7zip (supports both x86 and x64)

REM Check for 7zip install folder
if exist "%ProgramFiles%\7-Zip\7z.exe" set r=%ProgramFiles%\7-Zip\ &goto start1
if exist "%ProgramFiles(x86)%\7-Zip\7z.exe" set r=%ProgramFiles(x86)%\7-Zip\ &goto start1
COLOR 74
ECHO No 7zip installation folder found...
ECHO Need to install 7zip 16.04 or later
pause >nul
EXIT /b

:start1
cls
goto start2

:start2
ECHO.
ECHO Choose compression level:
ECHO.
ECHO 1 - Normal (LZMA2)
ECHO 2 - High   (LZMA2)
ECHO 3 - Ultra  (LZMA2)
ECHO.
set /p input= Input number: 
ECHO.
if %input%==1 goto A
if %input%==2 goto B
if %input%==3 goto C
ECHO Incorrect value!
ECHO.
ECHO Press any key to go back.
pause >nul
cls
goto start1

:A
ECHO Choosen NORMAL
set x=-mx=5
set y=Normal
goto P1

:B
ECHO Choosen HIGH
set x=-mx=7
set y=High
goto P1

:C
ECHO Choosen ULTRA
set x=-mx=9
set y=Ultra
goto P1

:P1
ECHO Start compressing process:
REM Start time counting
set StartTime=%time:~-0,8%
set StTi0=%StartTime: =0%
REM Start unpacking process
set ROOTDIR=%CD%
ECHO.
ECHO Searching for 7z, RAR and ZIP files to recompress into 7zip [*%y%]...
for /R "%ROOTDIR%" %%F in (*.7z *.rar *.zip) do (
REM Set file attribute to "read+write"
ATTRIB -R "%%F"
ECHO.
ECHO Found %%F to recompress
REM Extract archive to folder "contents"
"%r%\7z" x "%%F" -o"%%F contents" | findstr /I "archive everything" 
REM Check if 7zip created the folder correctly
if exist "%%~fF contents" (
REM Change directory for 7zip
CD "%%~fF contents"
REM Start packing process
"%r%\7z" a -t7z "../%%~nF.7z" * %x% | findstr /I "archive everything" 
CD "%ROOTDIR%"
REM Delete the temporary "contents" folder
RMDIR "%%~fF contents" /S /Q
ECHO.
REM Start searching for the old archive
for /R %%F in (*.rar *.zip) do (
REM Check if its a copy - delete old archive
if exist "%%~pnF.7z" (
DEL "%%F" /F /Q
ECHO Deleting old archive %%~nxF...
) 
)
ECHO Recompressed %%~nxF to %%~nF.7z [*%y%]
)
)
REM Finish time counting
set FinishTime=%time:~-0,8%
set FiTi0=%FinishTime: =0%
REM Counting time process - calculating time in hh:mm:ss format - send seconds 
setlocal enabledelayedexpansion
call:timecalc %StTi0% StT
call:timecalc %FiTi0% FiT
call:difference %StT% %FiT%
ECHO.
ECHO Search ended.
REM Print counted time
ECHO All done. Wasted time: %d%
endlocal
pause
EXIT
REM Counting time process - seconds serialize
:timecalc
set "x=%~1"
set /a "%2=%x:~0,2%*3600+%x:~3,2%*60+%x:~6,2%"
EXIT /b
REM Counting time process - seconds deserialize
:difference
set /a "d=%~2-%~1"
set /a "hh=d/3600","mm=d/60%%60","ss=d%%60"
set "d="
for %%i in (%hh% %mm% %ss%) do (
    if %%i lss 10 (set "d=!d!0%%i:") else (set "d=!d!%%i:"))
set "d=!d:~,-1!"
EXIT /b
pause

Лайкнули ShanKey, Алик и ещё 2
ShanKeyАликReplaceStringМаркиз

Как говориться лучше довести чем подвести...

Добавил исправления и улучшения:

  • добавил поддержку портативного режима, он подхватывается первым - помещаем 7z.exe и 7z.dll в каталог с батником
  • ищет установку 7-Zip (еще каталоги и реестры)
  • добавил проверки на старые версии Windows и 7-Zip
  • переделал вывод данных - еще меньше ненужной информации, оставил только полезную
  • показывает количество файлов, размер каждого до и после, прогресс, временя начала, затраченное время
  • ввёл базовые проверки и алармы по работе с каталогами
  • заменил логику подсчета времени - теперь нет ошибок вычисления
  • переписал скрипт заново

Пока что не сделал, но есть идеи:

  • работа с многотомными архивами
  • еще больше проверок создания архивов для стабильности
  • добавление звуковых уведомлений
  • сделать .exe программу

7zUltra_recompressor_beta3.bat

@ECHO OFF
REM 7zUltra_recompressor - simple batch-utility to recompress and replace .zip, .rar, .7z files in the current directory and subfolders into 7zip with better compression level
REM Need to install latest version of 7-Zip (supports both x86 and x64)
REM Author MarineSolder
REM Time counting script by Mike Q
  color F1
  title 7zUltra_recompressor_beta3
:check0
  set portable=no
REM Check for Windows version 
  ver | findstr /i "5\.0\."       && goto fail0
  ver | findstr /i "5\.1\."       && goto fail0 
  ver | findstr /i "5\.2\."       && goto fail0
  ver | findstr /i "6\.0\." > nul && goto fail0
REM Check for WMIC
  if not exist "%SystemRoot%\System32\wbem\WMIC.exe" color F4&ECHO WMI COMMAND-LINE UTILITY (WMIC) is missing! Please fix it before start using 7zUltra_recompressor&pause >nul&EXIT 
REM Check for portable mode
  if exist "%cd%\7z.exe" (if exist "%cd%\7z.dll" set path1=%cd%\&set portable=yes&goto check2)
REM If not found - quick check for 7-Zip install folder
  if exist "%ProgramFiles%\7-Zip\7z.exe" set path1=%ProgramFiles%\7-Zip\&goto check2
  if exist "%ProgramFiles(x86)%\7-Zip\7z.exe" set path1=%ProgramFiles(x86)%\7-Zip\&goto check2
REM If not found - try to check registry
  reg query "HKLM\SOFTWARE\7-Zip" /V "Path64" >nul 2>&1
  if "%errorlevel%"=="0" (for /F "tokens=2*" %%I in ('2^> nul reg query "HKLM\SOFTWARE\7-Zip" /V Path64') do set path1=%%J&goto check1)
  reg query "HKLM\SOFTWARE\7-Zip" /V "Path" >nul 2>&1
  if "%errorlevel%"=="0" (for /F "tokens=2*" %%I in ('2^> nul reg query "HKLM\SOFTWARE\7-Zip" /V Path') do set path1=%%J&goto check1)
  goto fail1
:check1
REM Check received registry data for 7-Zip location
  if exist "%path1%7z.exe" goto check2
  goto fail1
:fail0
REM Windows version is not supported
  cls
  color F4&ECHO Your Windows version is too old! Not supported
  pause >nul&EXIT
:fail1
REM No 7-Zip install folder found
  cls
  color F4&ECHO No 7-Zip installation folder found... &ECHO Need to install 7-Zip 16.04 or later
  pause >nul&EXIT
:fail2
REM Version check negative
  cls
  color F4&ECHO Your 7-Zip version is too old! Need to install 7-Zip 16.04 or later
  pause >nul&EXIT 
:check2
  cls
REM Convert filepath to UNC format
  set "path0=%path1:\=\\%7z.exe"
REM Get 7-Zip version number from .exe
  for /F "usebackq skip=1" %%? in (`wmic datafile where "name='%path0%'" get version 2^>nul`) do call :check3 %%?
  pause >nul
:check3
  set "ver0=%1"
REM Check 7-Zip version number
  for /F "tokens=1,2,3,4 delims=." %%a in ("%ver0%") do (set major=%%a&set minor=%%b)
  if %major% leq 16 (if %minor% lss 4 (goto fail2))
  if %major% leq 24 (if %minor% lss 9 powershell write-host -foregroundcolor DarkYellow "Recommend to update 7-Zip to version 24.09 or later")
REM Print full 7-Zip version 
  "%path1%7z" l "%path1%7z.exe" | findstr /b 7-Zip
REM Portable mode? 
  if %portable%==yes powershell write-host -foregroundcolor DarkGreen "PORTABLE MODE"
  goto menu1
:menu1
REM Menu option
  ECHO. &ECHO Choose compression level: &ECHO.
  ECHO 1 - Normal
  ECHO 2 - Maximum
  ECHO 3 - Ultra
  ECHO. &set /p input=Input number: &ECHO.
  if %input%==1 goto choice1
  if %input%==2 goto choice2
  if %input%==3 goto choice3
  ECHO Incorrect value! &ECHO. &ECHO Press any key to go back.
  pause >nul&cls&goto check2
:choice1
REM Menu choice 1
  ECHO Choosen NORMAL
  set settings=-mx=5&set complevel=Normal
  goto program1
:choice2
REM Menu choice 2
  ECHO Choosen MAXIMUM
  set settings=-mx=7&set complevel=Maximum
  goto program1
:choice3
REM Menu choice 3
  ECHO Choosen ULTRA
  set settings=-mx=9&set complevel=Ultra
  goto program1
:program1
REM Start working with files
  ECHO. &ECHO Start compressing process:
REM Start time counting
  set STARTTIME=%TIME%
  set _time=%TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
  ECHO Started at: %_time%
REM Start searching process
  set ROOTDIR=%CD%
  ECHO. &ECHO Set working direcory %ROOTDIR%
  ECHO Searching for 7z, RAR and ZIP files to recompress into 7zip [*%complevel%]...
REM Count found files  
  @for /f %%a in ('2^>nul dir "*.7z" "*.rar" "*.zip" /A:-D /S /B ^| find /V /C ""') do set n=%%a
  @echo Number of files found: %n%.
REM Print found file  
  for /R "%ROOTDIR%" %%F in (*.7z *.rar *.zip) do (
    ECHO. &ECHO Found %%F
REM Always set file attribute to "read+write"
    attrib -r "%%F"
REM Start unpacking process to folder "#temp#"
    "%path1%7z" x "%%F" -aoa -o"%%F #temp#" -bso0 -bse0 -bsp1
    "%path1%7z" l "%%F" -bse0 | findstr Physical
REM Check if 7-Zip created the folder
    if not exist "%%~fF #temp#" powershell write-host -foregroundcolor DarkRed "Warning! Cannot create folder '#temp#'!"
    if exist "%%~fF #temp#" (
REM Change directory for 7-Zip
      cd "%%~fF #temp#"
REM Start packing process
      "%path1%7z" a -t7z "../%%~nF.7z" * %settings% -bso0 -bse0 -bsp1
REM Check if 7-Zip created the file		  
      if not exist "%%F" powershell write-host -foregroundcolor DarkRed "Warning! New file "%%F" not found!"
      if exist "%%F" ECHO Recompressed to %%~nF.7z [*%complevel%]
      "%path1%7z" l "../%%~nF.7z" -bse0 | findstr Physical
REM Delete the temporary "#temp#" folder
      cd "%ROOTDIR%"
      rmdir "%%~fF #temp#" /s /q
REM Check if 7-Zip leaves .7z.tmp* service files - delete .7z.tmp*
      if exist "%%~pnF.7z.tmp*" del "%%~pnF.7z.tmp*" /f /q 
REM Start searching for the old archive
      for /R %%F in (*.rar *.zip) do (
REM Check if its a copy - delete old archive
        if exist "%%~pnF.7z" del "%%F" /f /q &ECHO Deleting old archive %%~nxF... 
        )
      )
    )
REM Finish time counting
  set ENDTIME=%TIME%
REM Counting time process - change fraction part for non-English localizations
  set STARTTIME=%STARTTIME:,=.%
  set ENDTIME=%ENDTIME:,=.%
REM Counting time process - change formatting for the start and end times
  for /F "tokens=1-4 delims=:.," %%a in ("%STARTTIME%") do (set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100")
    for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do ( 
       if %ENDTIME% GTR %STARTTIME% set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" 
       if %ENDTIME% LSS %STARTTIME% set /A "end=((((%%a+24)*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" 
       )
REM Calculate the elapsed time by subtracting values
  set /A elapsed=end-start
REM Counting time process - format the results for output
  set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100
  if %hh% lss 10 set hh=0%hh%
  if %mm% lss 10 set mm=0%mm%
  if %ss% lss 10 set ss=0%ss%
  if %cc% lss 10 set cc=0%cc%
  set DURATION=%hh%:%mm%:%ss%,%cc%
REM Print counted time
  ECHO. &ECHO Search ended. &ECHO All done. Wasted time: %DURATION%
  pause
EXIT

Лайкнули ShanKey, ReplaceString и Маркиз
ShanKeyReplaceStringМаркиз

Потихоньку это дело переросло в .exe программу...

Описание:


7z Ultra Recompressor
- мини-утилита для автоматического пересжатия большого количества архивов .7z, .rar, .zip в 7zip с высокой компрессией. В основе лежит идея создать максимально простой и в то же время надежный инструмент.

Принцип работы:

  • Переносим программу на диск или в папку где лежат все интересующие нас архивы.
  • Запускаем программу - программа работает только вглубь (вместе с подкаталогами) обрабатывая каждый однотомный архив *.7z, *.rar, *.zip, а также многотомные *.7z.XXX, *.rar.XXX, *.rXX, *partX.rar, *partXX.rar, *partXXX.rar, *.zip.XXX, *.zXX
  • Выбираем один из трех степеней компрессии - уровни имеют плавающую настройку величины словаря в зависимости от архивов. Если у вас не "картошкаПК" то всегда выбираем Ultra
  • Процесс разбит на три этапа:
    1. проверка дубликатов архивов в одной и той же папке, с выводом аларма - ситуация когда за вас никто не примет решения какой архив оставить
      конвертация многотомных архивов в однотомные - метод Copy (он же Store)
    2. перепаковка однотомных архивов с выбранным уровнем сжатия
    3. В процессе все временные папки с файлами удалятся. Получившиеся архивы .7z замещают старые архивы.
  • В конце подсчет количество операций, затраченное время и количество ошибок.

Системные требования:

ОС: Windows 7 (x86 & x64) и выше - рекомендуется Windows 10 22H1 (x64) и выше
7-Zip: 16.04 (x86 & x64) и выше - рекомендуется 24.09 (x64) и выше

ЦП: Чем жирнее тем лучше
ОЗУ минимум: от 6 Гб
ОЗУ рекомендуется*: от 8 Гб - для Normal, от 24 Гб - для Ultra
*7-Zip 24.09 (x64) и выше - рекомендуемые параметры для оптимальной скорости

В теории, с новыми версиями 7-Zip практически нет потолка по железу (для уровня ULTRA) - проверена производительность вплоть до 48 потоков и 128 Гб ОЗУ

Добавил исправления и улучшения:

         beta5

  • больше проверок на соответствие минимальным системным требованиям
  • составил подбор потоков 7-Zip в соответствии от количества ОЗУ, количества потоков ЦП и выбранной степени сжатия - меньше шанс получить ошибку переполнения памяти, при этом сохраняя оптимальную производительность
  • еще оптимизировал вывод данных в окно
  • исправил много мелких ошибок в коде который отвечает когда что-то идет не по плану
  • добавил базовые проверки на каждом этапе работы с файлами
  • добавил вывод алармов прописанных вручную (с использованием простых проверок if exist / if not exist, а также с использованием errorlevel от 7-Zip
  • подсчет количество операций и количество ошибок
  • добавил проверку на дубликаты архивов в одной и той же папке
  • добавил обработку многотомных архивов
  • добавил "начальную страницу" с напоминаем закрыть все архивы и архиваторы перед началом работы утилиты
  • добавил базовые звуковые уведомления
  • нарисовал иконку для программы
  • собрал в .exe

Скачать

По прежнему использовать только для тестирования!

Лайкнули ReplaceString и Маркиз
ReplaceStringМаркиз

beta6
Скачать

Поигравшись с настройками сжатия 7-Zip 24.09 сделал небольшие дополнения.
Добавил новый пресет Super Ultra - самый жесткий вариант, для тех случаев когда есть много времени и большое желание выжать максимум. Всё-таки придерживался здравого смысла и этот пресет не использует методы с десятками проходов и фильтров, поэтому скорость какая-никакая есть.

Описание:

7z Ultra Recompressor - мини-утилита для автоматического пересжатия большого количества архивов .7z, .rar, .zip в новый .7z с высокой компрессией. В основе лежит идея создать максимально простой и в то же время надежный инструмент.

Принцип работы:

  • Переносим программу на диск или в папку где лежат все интересующие нас архивы.
  • Запускаем программу - программа работает только вглубь (вместе с подкаталогами) обрабатывая каждый однотомный архив *.7z, *.rar, *.zip, а также многотомные *.7z.XXX, *.rar.XXX, *.rXX, *partX.rar, *partXX.rar, *partXXX.rar, *.zip.XXX, *.zXX
  • Выбираем один из четырех степеней компрессии - уровни имеют плавающую настройку величины словаря в зависимости от архивов. Количество потоков выбирается исходя из условий
  • Процесс разбит на три этапа:
    1. проверка идентичных имен архивов в одной и той же папке, с выводом аларма - ситуация когда за вас никто не примет решения какой архив оставить
    2. конвертация многотомных архивов в однотомные - метод Copy (он же Store)
    3. перепаковка однотомных архивов с выбранным уровнем сжатия
  • В процессе все временные папки с файлами удалятся. Получившиеся архивы .7z замещают старые архивы
  • В конце подсчет количество операций, затраченное время и количество ошибок.

Системные требования:

ОС: Windows 7 (x64) и выше - рекомендуется Windows 10 19H1 (x64) и выше
7-Zip: 16.04 (x64) и выше - рекомендуется 24.09 (x64) и выше

ЦП: Чем жирнее тем лучше
ОЗУ минимум: от 6 Гб
ОЗУ рекомендуется*: от 8 Гб - для Normal, от 24 Гб - для Ultra и Super Ultra
*7-Zip 24.09 (x64) и выше - рекомендуемые параметры для оптимальной скорости

В теории, с новыми версиями 7-Zip практически нет потолка по железу (для уровня Ultra) - проверена производительность вплоть до 48 потоков (AVX2) и 128 Гб ОЗУ

Добавил исправления и улучшения:

  • убрал поддержку Windows (x86) и 7-Zip (x86), т.к. это было для тестирования - теперь только Windows (x64) и 7-Zip (x64)
  • добавил кастомный пресет Super Ultra - требуется от 24 ГБ ОЗУ
  • исправил ошибку - при запуске из каталога имеющего скобки ( ) в названии, программа падала
  • переосмыслил логотип

Баги:

  • только при обработке многотомных архивов - если на пути есть проблемные символы ! @ & переименования не произойдет (к примеру получившийся *.7z.7z в *.7z) - однако все остальные операции должны пройти успешно
  • при определённых условиях вместо ошибки записи архива всплывает ошибка от PowerShell - однако счетчик ошибок срабатывает корректно

По-прежнему использовать только для тестирования!

 
 
Лайкнули ShanKey, ReplaceString и Маркиз
ShanKeyReplaceStringМаркиз
В процессе исправлений и добавлений новых функций - beta7 была запорота. Поэтому сразу за ней идет beta8, где я переписал весь код построчно.
Добавил немного новых функций. Долго не мог обойти проблему переименования многотомного архива в однотомный если есть спец спецсимволы. Вроде победил, однако нужно еще тестировать, особенно если балуетесь с паровозами в названиях файлов типа *.7z.7z.7z...
Несмотря на то что присутствуют проверки через WMIC и Powershell, которые в некоторых случаях занимают до 50мс на процесс - сама программа работает достаточно быстро.


7z Ultra Recompressor

beta8
Скачать

Описание:

7z Ultra Recompressor - мини-утилита для автоматического пересжатия большого количества архивов .7z, .rar, .zip в новый .7z с высокой компрессией. В основе лежит идея создать максимально простой и в то же время надежный инструмент.

Принцип работы:

  • Устанавливаем 7-Zip (x64) или кидаем 7z.exe и 7z.dll в папку с программой (портабельный режим).
  • Запускаем программу, выбираем уровень сжатия и рабочую директорию.
  • Программа обрабатывает каждый однотомный архив *.7z, *.rar, *.zip, а также многотомные *.7z.XXX, *.rar.XXX, *.rXX, *partX.rar, *partXX.rar, *partXXX.rar, *.zip.XXX, *.zXX.
  • Одна из четырех степеней компрессии - уровни имеют плавающую настройку величины словаря в зависимости от архивов. Количество потоков выбирается также исходя из условий.
  • Процесс разбит на три этапа:
    1. проверка идентичных имен архивов в одной и той же папке, с выводом аларма - ситуация когда за вас никто не примет решения какой архив оставить;
    2. конвертация многотомных архивов в однотомные - метод Copy (он же Store);
    3. перепаковка однотомных архивов с выбранным уровнем сжатия.
  • В конце подсчет количество операций, затраченное время и количество ошибок.
  • По завершению, если нет критических ошибок, все временные папки с файлами удалятся. Получившиеся архивы .7z замещают старые архивы.

Системные требования:

ОС: Windows 7 (x64) и выше - рекомендуется Windows 10 19H1 (x64) и выше
7-Zip: 16.04 (x64) и выше - рекомендуется 24.09 (x64) и выше

ЦП: Чем жирнее тем лучше
ОЗУ: Минимум от 6 Гб - рекомендуется* от 8 Гб - для Normal, от 24 Гб - для Ultra и Super Ultra
*7-Zip 24.09 (x64) и выше - рекомендуемые параметры для оптимальной скорости

В теории, с новыми версиями 7-Zip практически нет потолка по железу (для уровня Ultra) - проверена производительность вплоть до 48 потоков (AVX2) и 128 Гб ОЗУ.

Добавил исправления и улучшения:

  • Переосмыслил процессы, немного поменял последовательность операций внутри циклов.
  • Причесал все алармы и их последовательность сверки.
  • Заменил вывод алармов - вместо Powershell теперь использую Command-line colored ECHO processor (CECHO) by LoRd_MuldeR.
  • Переименование теперь производится в обход всех костылей - с помощью сторонней утилиты Command-line rename tool (BRC32) by Jim Willsher.
  • Добавил проверку на уже запущенный процесс 7z Ultra Recompressor - разрешено использовать только один процесс, во избежании потенциальных проблем.
  • Добавил диалоговое окно выбора директорий - теперь можно запускать программу из любого места.
  • Добавил сравнение CRC32 внутренностей старого и нового архивов - чтобы все было по-серьезному.
  • Исправил мелкие ошибки.

Баги:

Пока известные баги мною не выявлены...
Однако для отслеживания происходящих процессов рекомендую использовать directory watcher, по типу Folder Changes View от NirSoft.

По-прежнему использовать только для тестирования!

 
Лайкнули ShanKey, Lega77 и ещё 3
ShanKeyLega77syfleReplaceStringМаркиз

Привет. Выявил баг на бета8, у меня есть папки с модами для игр и я решил сначала посмотреть результат на одной из папок \моды\игра2, все прошло успешно, потом я решил перепаковать все архивы соответственно по пути \моды. Программа обработала \моды\игра1 затем застряла на \моды\игра2, которую уже обрабатывала и гоняет их по кругу постоянно перепаковывая. Использовал метод сжатия Ultra.

Лайкнул Павел
Павел

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

Цитата: syfle от 24.01.2025, 20:06

и гоняет их по кругу постоянно перепаковывая

Добрый! 
Вообще пока нет проверки на обработку уже пройденных файлов.
На моменте захода на повторный круг, можешь нажать "пробел" во время перепаковки - 7-Zip встанет на паузу, и сохрани лог окна. 

Делается так:

  • выбираешь окно программы
  • Ctrl+A , Ctrl+C
  • вставляешь в блокнот
Лайкнул Маркиз
Маркиз
Цитата: syfle от 24.01.2025, 20:34

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

Увидел скриншот, надо подумать

Лайкнул Маркиз
Маркиз

Павел,

на всякий

7-Zip 24.09 (x64) : Copyright (c) 1999-2024 Igor Pavlov : 2024-11-29

Choose compression level:                      * Total Physical RAM: 16 GB
                                               * Logical CPU threads: 12
1 - Normal
2 - Maximum
3 - Ultra
------------------------
4 - Super Ultra [* slow]

Input number: 3

Chosen ULTRA                                   * Number of threads applied: 12

Choose working directory...
Set working directory 'E:\Mods'

Want to START? [Y/N] Y

Start process:
Started at: 21:27:55
__________________________________________________________________________________________

Searching for duplicate archive names in one folder...
Duplicates not found
__________________________________________________________________________________________

Searching for multi-volume 7z, RAR and ZIP archives...
Number of archives found (multi-volume): 0
__________________________________________________________________________________________

Searching for single-volume 7z, RAR and ZIP archives...
Number of archives found (single-volume): 34

Recompressing single-volume archives into 7z [*Ultra]...

Found 'E:\Mods\English-Russian Databases.7z'
Physical Size = 21385051
Method = LZMA2:192m
Recompressed into 'English-Russian Databases.7z' [*Ultra]
Physical Size = 21385051
Method = LZMA2:192m
CRC32 values match

Found 'E:\Mods\ESP-ESM Translator.7z'
Physical Size = 14669313
Method = LZMA2:192m LZMA:20 BCJ2
Recompressed into 'ESP-ESM Translator.7z' [*Ultra]
Physical Size = 14669313
Method = LZMA2:192m LZMA:20 BCJ2
CRC32 values match

Found 'E:\Mods\English-Russian Databases.7z'
Physical Size = 21385051
Method = LZMA2:192m
Recompressed into 'English-Russian Databases.7z' [*Ultra]
Physical Size = 21385051
Method = LZMA2:192m
CRC32 values match

Found 'E:\Mods\ESP-ESM Translator.7z'
Physical Size = 14669313
Method = LZMA2:192m LZMA:20 BCJ2
Recompressed into 'ESP-ESM Translator.7z' [*Ultra]
Physical Size = 14669313
Method = LZMA2:192m LZMA:20 BCJ2
CRC32 values match

Found 'E:\Mods\English-Russian Databases.7z'
Physical Size = 21385051
Method = LZMA2:192m
Recompressed into 'English-Russian Databases.7z' [*Ultra]
Physical Size = 21385051
Method = LZMA2:192m
CRC32 values match

Found 'E:\Mods\ESP-ESM Translator.7z'
Physical Size = 14669313
Method = LZMA2:192m LZMA:20 BCJ2
Recompressed into 'ESP-ESM Translator.7z' [*Ultra]
Physical Size = 14669313
Method = LZMA2:192m LZMA:20 BCJ2
CRC32 values match

Found 'E:\Mods\English-Russian Databases.7z'
Physical Size = 21385051
Method = LZMA2:192m
Recompressed into 'English-Russian Databases.7z' [*Ultra]
Physical Size = 21385051
Method = LZMA2:192m
CRC32 values match

Found 'E:\Mods\ESP-ESM Translator.7z'
Physical Size = 14669313
Method = LZMA2:192m LZMA:20 BCJ2
Recompressed into 'ESP-ESM Translator.7z' [*Ultra]
Physical Size = 14669313
Method = LZMA2:192m LZMA:20 BCJ2
CRC32 values match

Found 'E:\Mods\English-Russian Databases.7z'
Physical Size = 21385051
Method = LZMA2:192m
Recompressed into 'English-Russian Databases.7z' [*Ultra]
Physical Size = 21385051
Method = LZMA2:192m

Ещё немного из опыта использования, если программа встречает архив с паролем, то начинает думать думу глубокую, я бы предложил либо насовсем пропускать такие архивы, либо скидывать их в конец очереди для последующего введения пароля пользователем. Portable режим не заработал, 7z.exe и 7z.dll взяты из 7z2409-x64.exe c официального сайта.
А вообще в целом программа и идея замечательная, здорово сделал, мне нравится!

Лайкнул Павел
Павел

syfle,
Я никак не могу получить подобный баг у себя. Вижу что программа постоянно гоняет два архива, пока не знаю с чем это связано, возможно какой-то момент с файловой системой...

Вопрос:
эти архивы .7z - это обычные файлы? не жесткие ссылки на файл? не имеют доп. атрибуты (архивный, скрытый)? Найдено 34 архива - там действительно столько в папке? Программа гоняет первые два архива и не переходит к следующим?
Попробуй для интереса beta3 (в виде bat) - ее надо запускать прямо из каталога, где лежат архивы.

Лайкнул Маркиз
Маркиз
Цитата: syfle от 25.01.2025, 00:57

Portable режим не заработал, 7z.exe и 7z.dll взяты из 7z2409-x64.exe c официального сайта.

Этот момент поправлю, это я промахнулся с относительными ссылками при сборке программы. Когда программа "разложена" по частям - все работает. При сборке уже не проверил этот момент.

Лайкнул Маркиз
Маркиз
Страница 1 из 4► 4