В своё время писал доминошные скрипты для обрезки движения (соответственно, создающие документы входящих остатков).
Но так как сами Pervasive базы не очищаются при этом - то дальше средствами Pervasive (Btrieve?) сжимал базы.
Для этого использовался такой bat-файл
Код:
@echo off
setlocal ENABLEDELAYEDEXPANSION
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rem !! Собственно, главные переменные... !!
rem !! еще не сообразил, как их "правильно передать"... !!
rem !! но... В принципе - 3 строчки можно подпрравить и руками... !!
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Set OldBase=D:\DOMINO\DATABASE\ИмяКаталогаСтаройБазы
Set NewBase=E:\DATABASE\ИмяКаталогаНовойБазы
Set Error_File=Err.txt
rem OldBase - указывает, где лежит текущая база
rem NewBase - указывает, куда будем класть новую
rem Error_File - имя файла "ошибок"
rem - а дальше рекурсивно идем по "текущей базе",
rem создаем ее полный аналог по структуре и
rem файлы Btrieve - переводим в новый формат
rem прочие файлы - просто копируем....
rem глубина "вложенности" для самого "глубоко зарытого" файла
rem - не более 10 уровней...
if exist %Error_File% del /Q %Error_File%
FOR /F "tokens=1-10 delims=" %%b IN ('echo %OldBase%') DO (
if "%%k"=="" set /A max_num=9
if "%%j"=="" set /A max_num=8
if "%%i"=="" set /A max_num=7
if "%%h"=="" set /A max_num=6
if "%%g"=="" set /A max_num=5
if "%%f"=="" set /A max_num=4
if "%%e"=="" set /A max_num=3
if "%%d"=="" set /A max_num=2
if "%%c"=="" set /A max_num=1
)
rem echo %max_num%
if NOT EXIST %NewBase% (
md %NewBase%
if not ERRORLEVEL=0 (
echo Ошибка при создании выходного каталога %NewBase%
echo Работа - закончена неудачно!
GOTO _EOF
)
) else (
echo Выходной каталога %NewBase% уже существует
echo Работа - закончена неудачно!
GOTO _EOF
)
FOR /R %OldBase% %%a IN (.) DO CALL :_SubCat %%a
type err.txt
GOTO :_EOF
:_SubCat
Set OldPath=%1
Set NewPath=%OldPath:~0,-1%
rem echo Работаю с путем %NewPath%
rem pause
FOR /F "tokens=1-10 delims=" %%b IN ('echo %NewPath%') DO (
if "%%k"=="" set /A tek_num=9
if "%%j"=="" set /A tek_num=8
if "%%i"=="" set /A tek_num=7
if "%%h"=="" set /A tek_num=6
if "%%g"=="" set /A tek_num=5
if "%%f"=="" set /A tek_num=4
if "%%e"=="" set /A tek_num=3
if "%%d"=="" set /A tek_num=2
if "%%c"=="" set /A tek_num=1
)
IF %tek_num% GTR %max_num% (
FOR /F "tokens=%max_num%,* delims=" %%b IN ('echo %NewPath%') DO (
set NewNewFold=%NewBase%\%%c
md !NewNewFold!
if not ERRORLEVEL=0 (
echo Ошибка при создании выходного каталога %NewNewFold%
echo Работа - закончена неудачно!
GOTO _EOF
)
)
)
for %%l in (%NewPath%*.*) do (
call butil -STAT %%l >nul
if !errorlevel!==0 (
rem файл - Btrieve, Всё нормально!!
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rem !! Ну, можно поставить еще проверки на правильность "клонирования", !!
rem !! но уже лень... !!
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rem Что-бы было "не скучно" - выведем имя файла
echo Работаю с файлом %%l
rem !!!!
butil -CLONE !NewNewFold!\%%~nl.dat %%l >nul
rem !!!!
BUTIL -SAVE %%l !NewNewFold!\%%~nl.txt >nul
rem !!!!
BUTIL -LOAD !NewNewFold!\%%~nl.txt !NewNewFold!\%%~nl.dat >nul
del /Q !NewNewFold!\%%~nl.txt
rem !!!!
) else (
echo Работаю с файлом %%l
echo Файл %%l - не файл Btrieve!!! >> %Error_File%
rem На всякий случай - их просто копируем в новый каталог
if "!NewNewFold!"=="" (
copy %%l %NewBase% >nul
) else (
copy %%l !NewNewFold!%%~nxl >nul
)
)
)
:_EOF