Сообщение отдельно
13.11.2019 10:53
KirillHome
 
В своё время писал доминошные скрипты для обрезки движения (соответственно, создающие документы входящих остатков).

Но так как сами 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