Заметки для всех

Архивирование APUVWIN с помощью 7zip

В стандартной поставке архивирование базы данных делается с помощью архиватора ARJ32
При этом имя файла выглядит так Pггммдд.ARJ (где гг - последние две цифры года, мм - две цифры месяца, дд - день месяца). Это вызывает пару неудобств.
1. Если в день несколько раз завершать работу APUVWIN - сохраняется только последняя версия архива.
2. Архивация проходит достаточно медленно.

Поскольку в поставке apuvwin уже используется модули архиватора 7zip (для работы со служебными файлами при отправке-получении), можно использовать его для штатного архивирования базы.

Для этого сделаем изменение для файла ARXIV.BAT Вот его "исходная версия"

:!:Учтите, что для командных файлов windows обычно используется DOS кодировка

ARXIV_ORIGINAL
@echo off
rem
rem      На входе необходимо задать два параметра:
rem 1-й параметр это имя архива (Pггммдд.ARJ)
rem 2-й параметр это путь к базе данных (C:\APUVWIN\DBF\)
rem
if %1.==. goto NOPARAM
arj32 a %1 %2*.dbf %2*.cdx %2*.fpt \apuvwin\apu8.* -xlocal*.* -xillicit.* -xpension.* -xrsck_lpu_hys*.*
if errorlevel 1 goto WARNING
goto EXIT
:NOPARAM
@echo           ┌────────────────────────────────────────────────────┐
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │           Не задан параметр имени архива !!!@echo           │        Обратитесь к программисту сопровождения.    │
@echo           │               Нажмите любую клавишу.               │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           └────────────────────────────────────────────────────┘
@pause >nul
goto QUIT
:WARNING
@echo           ┌────────────────────────────────────────────────────┐
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │        Архивирование завершилось аварийно !!!@echo           │                                                    │
@echo           │   Проверьте наличие и установку архиватора AR32J,  │
@echo           │         или наличие свободного места для копии.    │
@echo           │        Обратитесь к программисту сопровождения.    │
@echo           │               Нажмите любую клавишу.               │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           └────────────────────────────────────────────────────┘
@pause >nul
goto QUIT
:EXIT
@cls
@echo           ┌────────────────────────────────────────────────────┐
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │             КОПИРОВАНИЕ ПРОШЛО УСПЕШНО.            │
@echo           │                                                    │
@echo           │               ПРИЯТНОЙ ВАМ РАБОТЫ !@echo           │              НАЖМИТЕ ЛЮБУЮ КЛАВИШУ.                │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           └────────────────────────────────────────────────────┘
rem @pause >nul
:QUIT

Изменим его. Во первых, будем использовать имя архива, включающее время его создания:
Pггддмм-ччмм

Для этого создадим вспомогательный командный файл с именем pnmgen.cmd

pnmgen.cmd
@ECHO OFF
ECHO Генерирование имени файла вида PГГММДД-ччмм
::считываем системное время в переменную ТММ
:: пробел равно и процент нужны чтобы заменить в строке времени все пробелы на 0
SET TMM=%TIME: =0%
:: считываем системную дату в переменную DTA (вдруг у нас скрипт в полночь работает)
SET DTA=%DATE%
:: показываем наши переменные
ECHO  Текущая дата: %DTA%
ECHO Текущее время: %TMM%
::строковыми операциями извлекаем из строки даты и времени нужные циферки 
::и складываем их в переменную F7ZNAME
SET F7ZNAME=P%DTA:~-2%%DTA:~3,2%%DTA:~,2%-%TMM:~,2%%TMM:~3,2%
::показываем что получилось
ECHO Имя файла: "%F7ZNAME%"
REM ECHO Пример имени архива: %F7ZNAME%.7z
::все описания команды SET можно "подглядеть"
::набрав в командной строке
::help set
GOTO :EOF

Размещаем этот скрипт в папке APUVWIN И модифицируем скрипт архивирования заменив архиватор на 7zip использующий эквивалентные опции командной строки

ARXIV7zip.bat
@echo off
rem
rem      На входе необходимо задать два параметра:
rem 1-й параметр это имя архива (Pггммдд.ARJ)
rem 2-й параметр это путь к базе данных (C:\APUVWIN\DBF\)
rem
if %1.==. goto NOPARAM
ECHO Start with: %0 %1 %2
ECHO.
REM arj32 a %1 %2*.dbf %2*.cdx %2*.fpt \apuvwin\apu8.* -xlocal*.* -xillicit.* -xpension.* -xrsck_lpu_hys*.*
REM ниже эквивалентная команда для 7z.exe
REM 7z.exe a %1.7z -mx4 -spf2 %2*.dbf %2*.cdx %2*.fpt C:\APUVWIN\apu8.* -xr!local*.* -xr!illicit.* -xr!pension.* -xr!rsck_lpu_hys*.*
:: был вариант более длинного имени файла, включающего четыре цифры года, для этого использовался файл pnamegen.cmd
:: но потом отказался от этого. При желании можно на свой вкус переделать.
REM longname PГГГГММДД-ччмм.7z
REM CALL pnamegen.cmd

REM shortname PГГММДД-ччмм.7z
CALL pnmgen.cmd
ECHO 7z.exe a %F7ZNAME%.7z -spf2 %2*.dbf %2*.cdx %2*.fpt C:\APUVWIN\apu8.* -xr!local*.* -xr!illicit.* -xr!pension.* -xr!rsck_lpu_hys*.*
7z.exe a %F7ZNAME%.7z -mx4 -spf2 %2*.dbf %2*.cdx %2*.fpt C:\APUVWIN\apu8.* -xr!local*.* -xr!illicit.* -xr!pension.* -xr!rsck_lpu_hys*.*
 
if errorlevel 1 goto WARNING
goto EXIT
:NOPARAM
@echo           ┌────────────────────────────────────────────────────┐
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │           Не задан параметр имени архива !!!@echo           │        Обратитесь к программисту сопровождения.    │
@echo           │               Нажмите любую клавишу.               │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           └────────────────────────────────────────────────────┘
@pause >nul
goto QUIT
:WARNING
@echo           ┌────────────────────────────────────────────────────┐
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │        Архивирование завершилось аварийно !!!@echo           │                                                    │
@echo           │   Проверьте наличие и установку архиватора AR32J,  │
@echo           │         или наличие свободного места для копии.    │
@echo           │        Обратитесь к программисту сопровождения.    │
@echo           │               Нажмите любую клавишу.               │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           └────────────────────────────────────────────────────┘
@pause >nul
goto QUIT
:EXIT
@cls
@echo           ┌────────────────────────────────────────────────────┐
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │             КОПИРОВАНИЕ ПРОШЛО УСПЕШНО.            │
@echo           │                                                    │
@echo           │               ПРИЯТНОЙ ВАМ РАБОТЫ !@echo           │              НАЖМИТЕ ЛЮБУЮ КЛАВИШУ.                │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           │                                                    │
@echo           └────────────────────────────────────────────────────┘
rem @pause >nul
:QUIT

Теперь в папке APUVWIN копируем оригинальный файл скрипта (для сохранения)

copy ARXIV.BAT ARXIVarj.BAT

и подсовываем новый скрипт архивирования

copy ARXIV7zip.bat ARXIV.BAT

После этого, при выходе из программы, архивирование будет производится с помощью 7zip (значительно быстрее, при этом архив получается почти в два раза меньше, например вместо 115Мб - 72Мб

PS: После каждого обновления APUVWIN следует повторить подмену скрипта архивирования

copy ARXIV7zip.bat ARXIV.BAT

поскольку в процессе обновления восстанавливается версия скрипта архивирования с ARJ