ТаблицейБлоками.

Оптимизация и спасение IBM PC: Резервное копирование

Последняя модификация: 10.08.2014 г

Страница загружена с адреса: http://comp.site3k.ru/ibmpc/chaptr28.html

Моя студия веб-дизайна

Глава 28: Резервное копирование.

Не смотря на множество способов восстановления данных, лучшим способом их защиты является резервное копирование. В нем тоже, способов не счесть.

Во первых, его можно выполнять либо вручную, либо с помощью специальных программ. Применение специальных программ облегчает процесс.

Во вторых, его можно выполнять со сжатием, либо без. Сжатие позволяет экономить место.

В третьих, копировать можно либо целиком, весь диск, либо выборочно. Выборочное копирование экономит не только место, но и время.

Для выборочного копирования могут применяться различные программы:

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

Сохранить информацию об исходном расположении, позволяет копирование непосредственно из программ-архиваторов: необходимо дать команду “добавить в архив” (или “создать архив”) и в появившемся окне выбора файлов для архивации, ввести требуемый шаблон. Если требуется, следует отметить опцию “включая вложенные папки” и (в зависимости от особенностей программы), отдельно указать, что выбор происходит по шаблону.

Однако, архивация по шаблону не всегда удобна. Иногда более удобен выбор конкретных объектов, и, если они находятся в одном каталоге, он может производиться как в архиваторе, так и в обычном файловом менеджере, например, Explorer (с последующим выбором пункта архивации из контекстного меню). Проблемы возникают только тогда, когда желаемые файлы находятся в разных папках. Из множества существующих программ для резервного копирования, архивацию файлов сразу из нескольких каталогов, не вложенных друг в друга, поддерживают только единицы, в остальных же, процедуру архивации приходиться выполнять в несколько (десятков) приемов, постоянно добавляя файлы к созданному архиву, от чего не трудно и запутаться.

Одной из немногих программ, позволяющих одним приемом заархивовать файлы из нескольких независимых источников (возможно, в графическом варианте, таких программ всего две), является программа Backup, входящая в состав Windows. У нее есть три существенных недостатка:

  1. Она задает слишком много вопросов.
  2. Она недостаточно сильно сжимает.
  3. С созданными ею архивами не может работать не одна другая программа.

Этих недостатков лишена программа PkZip fo Windows, бесплатно распространяемая корпорацией PkWare. Имеются у нее и другие преимущества. Если программа ZipMagic творит волшебство с архивами, то программа PkZip творит волшебство с самим процессом их создания.

После запуска программы, процесс создания архива сводится к следующему:

Команда “New” (Create a new .zip file) из меню “File”, открывает окно выбора имени и размещения архива, затем открывается окно выбора, подлежащих копированию, объектов.

Для того чтобы выбрать папку, а не просто открыть, после ее выделения нажимается кнопка “Add Directory”, а чтобы вложенные папки так же попали в архив, в настройках (Preferences) данного окна, должно быть указано “включить вложенные папки” (Include subdirectories). Этот параметр стоит сохранить по умолчанию (Save as default) – такое включение требуется в большинстве случаев.

Добавление файла аналогично – только нажимается кнопка “Add files”. Для множества файлов можно использовать выделение протягиванием мыши (гораздо удобней, чем многократные щелчки для установки флажков в программе Backup) или шаблон, введя его в списке “Filter” и нажав кнопку “Add filter” – подобной команды Backup не поддерживает. Так же, по фильтру файлы можно исключить (кнопка “Exclude Filter”), но можно исключить и конкретные файлы (кнопка “Manual Add”).

Отметив требуемое в одном источнике, можно перейти к другому и всего несколькими командами создать задание всеобщей архивации на любой вкус. Затем нажимается кнопка “Ok” и по окончании сжатия, “Done” – архив готов. Для его обновления, в случае необходимости, в окне выбора, появляющегося по команде “Add files”, достаточно установить переключатель “Add options” в положение “Update files” – программа сама проверит, какие файлы из содержащихся в архиве, после архивации были изменены и обновит о них данные -- но столь простую операцию выполнит и любая другая программа, работающая с форматом Zip.

Единственным недостатком PkZip (версии 2.60) является его отсутствие в контекстном меню Explorer. Поэтому, для обычного сжатия, с целью более компактного умещения файлов подлежащих перемещению на другой компьютер (например, на дискете), целесообразней применять другую программу.

Наиболее подходит для этой цели WinRar, уже хотя бы потому что, в режиме непрерывного архива в формате Rar, обеспечивает более высокое сжатие, чем любой Zip. Кроме того, WinRar удобен благодаря своей простоте. По сути, это не архиватор, а одно-панельный файловый менеджер, типа окна “Мой компьютер”, с несколько ограниченным контекстным меню (многие менеджеры вообще без него обходятся). Он и архивы представляет в виде вложенных друг в друга папок. Иногда это кажется наглядным, но одним взглядом оценить содержимое архива невозможно. Зачастую, более целесообразным представляется классическое отображение архива в виде полного списка находящихся в нем файлов.

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

ZipMagic – входящая в его состав утилита ZipTools является не только отличным тактическим архиватором (если считать программы резервного копирования архиваторами стратегическими), но и не менее отличным одно или двухпанельным файловым менеджером, перенастраиваемым по желанию пользователя и полностью поддерживающим контекстное меню. Если Zip-архивы ассоциируются с ZipMagic, ZipTools отображает их в любом виде: в противном случае, только в классическом (в виде списка). Но если уж пользоваться ZipMagic, то, скорее, в “магическом” режиме, кроме всего прочего, в нем увеличивается скорость доступа к архиву, поскольку программа висит в памяти резидентно.

Compressed Folders – компонент MS Plus 98 предназначенный для новичков, боящихся запутаться в параметрах сжатия. После его установки в команде “отправить”, контекстного меню, появляется пункт “Compressed Folders”, при выборе которого, в текущей директории, под именем первого из выделенных файлов, появляется готовый архив. Никаких дополнительных параметров – дешево и сердито.

WinZip – отличается непревзойденной красотой и наглядностью. Небывалое число (десять) вариантов сортировки, особое выделение файлов Read.me и Setup.exe (для удобства их поиска)... Учитывая возможность полной перенастройки интерфейса, открывать архивы хочется именно в нем. Особенно, учитывая, что он понимает русские имена в кодировке большинства архиваторов, в то время как другие (кроме WinRar – тот вообще вездеход) к этому слишком чувствительны.

PkZip fo DOS 32-битная версия 2.50 – полезен тем, что работает в любой операционной системе и, поддерживая длинные имена Windows, позволяет автоматизировать процесс обновления архивов (консольная версия  WinRar тоже допускает автоматизацию, но при незначительном преимуществе по степени сжатия, значительно уступает в скорости).

Как и любая другая консольная программа, PkZip не распознает введенные в командную строку имена, состоящие из нескольких слов (содержащие пробелы), считая новое слово именем источника и, в командной строке, их приходится задавать в формате DOS, теряя исходное имя. Но для решения этой проблемы существует два способа:

  1. Заключение длинных имен в кавычки.
  2. Архивация по списку. Каждая строка такого списка представляет отдельный файл или шаблон и, путаницы с его считыванием не происходит.

Подключается список командой вида: PkZip параметры архив @список.

Команда:

PkZip параметры архив -@список источники

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

Автоматизация процесса резервного копирования существенно повышает уровень общей оптимизации работы компьютера и защиты информации от повреждения, но поднять ее на должный уровень невозможно без специальных средств. Одним из таких средств является  NDOS.com из Нортоновских утилит для DOS, а его сочетание с 32-битным PkZip для DOS, дает наилучший результат. Приведенный ниже пакетный файл является тому наглядным примером.

@echo off
if exist C:\dos\arhiv.log goto NONEW
echo %_date > C:\dos\Arhiv.log

C:\dos\pkzip -Pr -! -Wsh C:\Моидок~1\Новый.zip @C:\dos\список.txt -x@C:\dos\лишнее.txt
if errorlevel 1 pause Проблемы с созданием Нового зипа
C:\progra~1\arhiv\winrar\rar a -mm -sfx -ep1 -zC:\моидок~1\энциклопедия\1.txt C:\Моидок~1\Энциклопедия.exe C:\моидок~1\Энциклопедия\*.* 
if errorlevel 1 pause Проблемы с созданием Энциклопедии.
Quit

:NONEW
if %_date==%@line[C:\dos\arhiv.log,0] quit
echo %_date > C:\dos\arhiv.log

C:\dos\pkzip -ur -! -Wsh C:\Моидок~1\Новый.zip @C:\dos\список.txt -x@C:\dos\лишнее.txt
if errorlevel 1 pause Проблемы с обновлением Нового зипа
C:\progra~1\arhiv\winrar\rar u -ep1 -mm C:\Моидок~1\Энциклопедия.exe C:\моидок~1\Энциклопедия\*.*
if errorlevel 1 pause Проблемы с обновлением Энциклопедии.
 
IF NOT %_DOW==Tue QUIT
 
if not exist D:\Новый.zip goto NOEX1
if %@filedate[D:\Новый.zip]==%@filedate[C:\моидок~1\Новый.zip] goto NOOLD1
if exist D:\Старый.zip del D:\Старый.zip
ren D:\Новый.zip D:\Старый.zip
:NOEX1
copy C:\Моидок~1\Новый.zip D:\
:NOOLD1
 
if not exist D:\Энцикл~1.exe goto NOEX2
if %@filedate[D:\Энцикл~1.exe]==%@filedate[C:\моидок~1\Энцикл~1.exe] goto NOOLD2
if exist D:\Старая.exe del D:\Старая.exe
ren D:\Энцикл~1.exe D:\Старая.exe
:NOEX2
copy C:\Моидок~1\Энцикл~1.exe D:\
:NOOLD2

Первый блок данного файла проверяет наличие отчета, в котором фиксируется дата последнего выполнения работы, а если таковой отсутствует, создает этот отчет, фиксируя текущую дату. Второй блок создает архивы, если отчет не найден (а значит, архивация еще не проводилась), и проверяет качество их создания, приостанавливая работу и выводя сообщение, в случае проблем. Затем завершает работу. Третий блок проверяет записанную в отчет дату. Если работа в данный день уже выполнялась, или же, проводилась впервые, дальнейшее выполнение файла прекращается, чтобы не тратить время на лишнее резервирование, если нет, зафиксированная в отчете дата обновляется и приводится в исполнение следующий блок, в котором производится обновление архивов и проверка их качества.

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

Наличие двух копий архива очень существенно. Если в архив каким-то образом попадает поврежденный файл, (это можно предотвратить удерживанием Shift при загрузке Windows), восстановить его можно из архива обновляемого раз в неделю. А если попадание в архив поврежденного файла произошло как раз в день обновления запасного архива и, таким образом, в редко обновляемом архиве оказалась та же самая, поврежденная версия, восстановить файл можно из старой версии запасного архива, которой в этот день исполняется ровно неделя (или сколько-то еще, поскольку при желании, генеральную резервацию можно проводить чаще или реже чем раз в неделю).

Седьмой блок проводит генеральную резервацию следующего архива.

Однажды определив подобное задание и поместив в меню автозапуска ярлык с командной строкой:

C:\dos\ndos.com /c C:\Dos\New.bat

где

C:\dos\ndos.com является полным путем и именем для Ndos.com1

/C - параметр вызова

C:\Dos\New.bat - полный путь и имя описанного пакетного файла

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

Учитывая что, при некоторых незначительных затруднениях Rar генерирует код возврата равный единице, при обновлении Rar-архива (но не при создании), исходные файлы которого могут не изменится за сутки, протекшие с момента предыдущей архивации, следует проверять Errorlevel не ниже двух, иначе бат-файл начнет трубить о проблемах, даже когда архив не нуждается в обновлении (код завершения Rar, в этом случае, равен единице). PkZip в таком случае генерирует 12, поэтому, если реально возможна ситуация, чтобы не один из архивируемых файлов не изменился в течение суток, убедившись в корректности работы бат-файла (любая грамматическая ошибка может развалить весь механизм), следует изменить строку проверки обновления Zip-архива и вместо

if errorlevel 1 pause Проблемы с обновлением Нового зипа

вставить

if errorlevel 1 .AND. errorlevel NE 12 pause Проблемы с обновлением Нового зипа

Команда понимается буквально: "Если код возврата не менее единицы (отношение "не менее" для Ndos принято по умолчанию) и, при этом, не 12, поднимай тревогу".

Данное отступление снижает уровень сигнализации, но, при безошибочной записи команд, вряд ли более чем на сотую долю процента.

Если ежедневное выполнение задания крайне необходимо, то для продолжения его выполнения даже после принудительного прерывания (например, вследствие отключения напряжения), команду записи протокола (строку "echo %_date > C:\dos\Arhiv.log") следует переместить так, чтобы она находилась только в конце файла и перед командами QUIT. Строка IF NOT %_DOW==Tue QUIT при этом примет вид:

IF NOT %_DOW==Tue (echo %_date > C:\dos\Arhiv.log^QUIT)

В этом случае, дата будет обновляться только после полного выполнения задания.

NDOS передает программам любые имена файлов, в виде параметров запуска, однако, сам умеет работать только с короткими, поэтому, когда он обрабатывает их сам, ему необходимо указывать имена в формате DOS. Если же нужно сохранить длинное имя (это возможно только из-под Windows), то для копирования и переименования следует вызвать Command.com с параметром /C, например:

Command /c copy C:\Моидок~1\Энцикл~1.exe D:\

Для большего удобства, в свойствах ярлыка можно указать, чтобы программа сворачивалась в значок при запуске и сама закрывалась при завершении работы, а для того чтобы вовремя отреагировать на возникающие проблемы, в первый блок файла можно добавить строку:

Alias pause beep 349 11 233 11 349 11 233 11 349 11 233 11 349 11 233 11^*pause %&

Для уменьшения вводимых в командную строку параметров сжатия, при работе с PkZip (как и для Rar), предусмотрено изменение параметров, принимаемых по умолчанию, с помощью файла конфигурации PkWare.ini, имеющего следующий вид:

[PKZIP]

PATHS=ALL

INCLUDE=HIDEN/SYSTEM

VIEW=BRIEF/NAME/MORE

COMPRESS=EXTREME

RECURSE=ON

 

[PKUNZIP]

DIRECTORIES=ENABLED

VIEW=BRIEF/NAME/MORE

Где первый блок определяет параметры сжатия (сохранять все пути, включать в архив скрытые и системные файлы, при просмотре выдавать содержимое кратко, сортируя по именам, приостанавливаясь при заполнении экрана), а второй, параметры распаковки. Подробности составления этого файла приводятся в файле Manual.txt, поставляемом вместе с программой.

Для корректной работы PkWare.ini, в файле Autoexec.bat следует определить переменную PkWare.ini, указывающую на каталог, его содержащий. Например, SET PKWARE.INI=C:\PKWARE.

При резервном копировании, с применением Zip-архиваторов, автоматическая активизация ZipMagic в "магический" режиме, не желательна. Ее следует запретить, открыв свойства (Properties) ZipMagic и, на вкладке "Settings", установить флажок на опции "Start disabled". После выполнения копирования, ее можно разрешить заново, при чем, прямо из пакетного файла, где вместо команды Quit применить переход на метку в конец файла, после которой, ввести команду Start /w ZmCmdln.exe /e+ (предварив ее путем к папке ZipMagic).

Пример из жизни.

Ниже предлагается реальное задание архивации tps-файлов (базы данных) с сервера на локальный диск с последующим снятием «имиджа» этого диска.

: Данный способ (использующий архивный атрибут) создает не три архива
: (как прежний), а шесть.
: Поэтому, если большинство архивируемых файлов ежедневно изменяется,
: он требует больше места для всей совокупности создаваемых архивов.
: Однако если ежедневно обновляется только их небольшая часть,
: дает заметную экономию дискового пространства.
: Требуется эксперимент, для выбора оптимального метода.

: Очевидным преимуществом данного способа является наличие не только
: вчерашней копии и копии недельной давности,
: но и копий за каждый рабочий день в течение всей недели.
 
@echo off
alias pause `beep 349 11 233 11 349 11 233 11 349 11 233 11 349 11 233 11^*pause %&`
if exist D:\archiv\archiv.log goto NONEW

pkzip -a+ -pr -Wsh D:\archiv\Главный.zip W:\*.tps
  if errorlevel 1 pause Проблемы с созданием Главного зипа.
echo %_date > D:\archiv\archiv.log
C:\Progra~1\Norton\Utilit~1\IMAGE32 D: /OUT
Quit

:NONEW
if %_date==%@line[D:\archiv\archiv.log,0] quit

IFF NOT %_DOW==Пт. then
  if exist D:\archiv\%_DOW%zip del D:\archiv\%_DOW%zip
  pkzip -ipr -Wsh D:\archiv\%_dow%zip W:\*.tps
    if errorlevel 1 .and. errorlevel ne 12 pause Проблемы с созданием %_dow%zip
else
  copy /u D:\archiv\Главный.zip D:\archiv\Запасной.zip
  pkzip -ur -Wsh D:\archiv\Главный.zip W:\*.tps
    if errorlevel 1 .and. errorlevel ne 12 pause Проблемы с обновлением Главного зипа
    If «%WinDir» != «» setdos /i-attrib
    attrib -A W:\*.tps /s
endiff

echo %_date > D:\archiv\archiv.log
C:\Progra~1\Norton\Utilit~1\IMAGE32 D: /OUT

Далее приведен усовершенствованный вариант этой же программы, в который добавлены команды по защите самого процесса создания резервных копий, возможности автоматического возврата его в исходное состояние и автоматического доархивирования файлов блокированных другими программами. Так же добавлены переменные, позволяющие легко адаптировать ее под любые потребности: изменение пяти переменных собранных в начале программы избавляет от необходимости искать и исправлять команды по всему ее тексту (впрочем, можете взять готовую, более удобную программу под  Windows).

@echo off
SetLocal
: Переменная DIRECTORY указывает каталог для архивов и
: должна заканчиваться слешем (\)
set DIRECTORY=
: Переменная DIRECTCD так же указывает каталог для архивов и должна
: заканчиваться слешем (\), но вместо указания пути каждого файла,
: служит для назначения рабочего каталога, экономя память
: (аналогично папке назначаемой в ярлыке программы).
: Эти переменные взаимозаменяемы.
Set DIRECTCD=D:\archiv\
: Переменная DISK указывает букву диска с файлами данных (требуется
: для возможности восстановления атрибутов), и должна содержать двоеточие
set DISK=W:
: Переменная DATA содержит указание на архивируемые данные
set DATA=W:\*.tps
: Переменная DEY содержит день создания главного архива в том виде, в котором
: он возвращается по команде ECHO %_DOW
set DEY=Пт.
: Переменная WARNING содержит сообщение о том, что файл не попал в архив
: (для данной версии PkZip это «PKZIP: (W02) Warning! can't open:»)
set WARNING=PKZIP: (W02) Warning! can't open:
: Перечисленные переменные можно заменить параметрами типа %1
: и вводить при вызове файла

alias pause `beep 349 11 233 11 349 11 233 11 349 11 233 11 349 11 233 11^*pause %&`
alias Inkey `beep 349 11 233 11 349 11 233 11 349 11 233 11 349 11 233 11^*inkey %&`
if "%DIRECTCD" != "" (cdd %DIRECTCD^unset DIRECTCD)
if exist %DIRECTORY%archiv.log goto NONEW

scrput 5 25 Green on %_BG А Н А Л И З  Д А Н Н Ы Х
pkzip -a+ -pr -Wsh %DIRECTORY%Главный.zip %DATA | tee %DIRECTORY%arhiv.txt
  If errorlevel==18 GoSub ReArc
  iff errorlevel 1 then
     pause Проблемы с созданием Главного зипа, жми пробел.
     list %DIRECTORY%arhiv.txt
     cls
     *inkey /K"YN" Продолжить выполнение (Y/N) ? %%Var
     If "%Var"=="N" Quit
  else
     del %DIRECTORY%arhiv.txt > nul
  endiff
echo %_date > %DIRECTORY%archiv.log
Quit

:NONEW
if %_date==%@line[%DIRECTORY%archiv.log,0] quit
 
IFF NOT "%_DOW"=="%DEY" then

  iff exist %DIRECTORY%%_DOW%zip then
      ren %DIRECTORY%%_DOW%zip %_DOW%bak > nul
      iff "%_?" != "0" then
         inkey /K"YN" Проблемы с созданием %_DOW%bak, возможно нет места. продолжить (Y/N) ? %%Var
         If "%Var"=="N" Quit
      endiff
  endiff
  pkzip -ipr -Wsh %DIRECTORY%%_dow%zip %DATA | tee %DIRECTORY%arhiv.txt
  If errorlevel==18 GoSub ReArc
  iff errorlevel 1 .and. errorlevel ne 12 then
      pause Проблемы с созданием %_dow%zip, жми пробел.
      list %DIRECTORY%arhiv.txt
      :UNDO
      (echo Безоговорочный выход
      echo Вернуть в исходное состояние
      echo Цивилизованное завершение) | (set Var=%@select[con,3,20,20,55,ДАЛЬНЕЙШИЕ ДЕЙСТВИЯ])
      If "%Var%"=="" (Beep^goto /i UNDO)
      If "%Var%"=="Безоговорочный выход" Quit

      Iff "%Var%"=="Цивилизованное завершение" Then
          unset Var
          find /i "%WARNING" %directory%arhiv.txt > %directory%NoArc.txt
          unset cmdline
          : Удаление подстроки "PKZIP: (W02) Warning! can't open:"
          : Поиск начинается со строки 2 поскольку строки 0 и 1,
          : выдаваемые программой Find никому не нужны
          set NUM=2
          set FILE=%%@Line[%DIRECTORY%NoArc.txt,%%num]
          iff "%file"=="**EOF**" then
               del %DIRECTORY%NoArc.txt > nul
          else
               cls
               beep
               *inkey /K"YN" Создать список файлов не попавших в архив (Y/N) ? %%Var
               if "%Var"=="Y" GoSub NOARC
               list %directory%NoArc.txt
               beep
               *inkey /K"YN" Сохранить его в файле %directory%NoArc.txt (Y/N) ? %%Var
               if "%Var"=="N" del %directory%NoArc.txt > nul
          endiff
          Beep
          *inkey /K"YN" Сохранить сообщения архиватора (Arhiv.txt) и BAK-файл (Y/N) ? %%Var
          If "%Var%"=="N" Del %DIRECTORY%%_DOW%bak Arhiv.txt > nul
      endiff

      Iff "%Var%"=="Вернуть в исходное состояние" then
          : Освободим память
          unset WARNING
          unset var
          if not exist %DIRECTORY%%_DOW%zip GoTo /i END
              PkUnzip -d %DIRECTORY%%_DOW%zip -@%DIRECTORY%Arhiv.txt
              unset cmdline
              set NUM=0
              set FILE=%@Line[%DIRECTORY%Arhiv.txt,%num]
              iff "%file"=="**EOF**" then
                  echo Не удалось прочесть файл списка - "Arhiv.txt" или он пуст.
                  del %DIRECTORY%Arhiv.txt > nul
                  beep
                  *pause
                  goto /i SKIP
              endiff
              If «%WinDir» != «» setdos /i-attrib
              :ATTRIBUT

              : ________________________________________________________________
              :CIKL  Этот фрагмент только для PkUnZip (замена знака / на знак \)
              set POZ=%@index[%file,/]
              IFF "%POZ%" != "-1" then
                  set File1=%FILE1%%@substr[%file,0,%poz]\
                  set File=%@substr[%file,%@Eval[%poz+1]]
                  if "%@index[%file,/]" != "-1" GoTo /i CIKL
                  set File=%File1%%file
                  unset file1
              endiff
              : ________________________________________________________________

              attrib +A "%Disk%\%File"
              : Освобождение памяти
              unset cmdline
              set NUM=%@Eval[%num+1]
              set FILE=%@Line[%DIRECTORY%Arhiv.txt,%num]
              if not "%File"=="**EOF**" goto /i ATTRIBUT
              :SKIP
              Del %DIRECTORY%%_DOW%zip > nul
          :end

          if exist %DIRECTORY%%_DOW%bak Ren %DIRECTORY%%_DOW%bak %_DOW%zip > nul
          del %DIRECTORY%arhiv.txt > nul
          Quit
      endiff
  else
      if exist %DIRECTORY%%_DOW%bak del %DIRECTORY%%_DOW%bak > nul
      del %DIRECTORY%arhiv.txt > nul
  endiff

Else
  iff "%@filedate[%DIRECTORY%Главный.zip]" != "%@filedate[%DIRECTORY%Запасной.zip]" then
      copy %DIRECTORY%Главный.zip Запасной.zip > nul
      Iff "%_?" != "0" then
          inkey /K"YN" Проблемы с копированием Главного архива, возможно нет места. продолжить (Y/N) ? %%Var
          If "%Var"=="N" Quit
      endiff
  endiff
  pkzip -ur -Wsh %DIRECTORY%Главный.zip %DATA | tee %DIRECTORY%arhiv.txt
  If errorlevel==18 GoSub ReArc
  Iff errorlevel 1 .and. errorlevel ne 12 then
      pause Проблемы с обновлением Главного зипа, жми пробел.
      list %DIRECTORY%arhiv.txt
      :UNDO2
      (echo Безоговорочный выход
      echo Вернуть в исходное состояние
      echo Цивилизованное завершение) | (set Var=%@select[con,3,20,20,55,ДАЛЬНЕЙШИЕ ДЕЙСТВИЯ])
      If "%Var%"=="" (Beep^goto /i UNDO2)
      If "%Var%"=="Безоговорочный выход" Quit

      Iff "%Var%"=="Цивилизованное завершение" Then
          unset Var
          find /i "%WARNING" %directory%arhiv.txt > %directory%NoArc.txt
          unset cmdline
          : Удаление подстроки "PKZIP: (W02) Warning! can't open:"
          : Поиск начинается со строки 2 поскольку строки 0 и 1,
          : выдаваемые программой Find никому не нужны
          set NUM=2
          set FILE=%%@Line[%DIRECTORY%NoArc.txt,%%num]
          iff "%file"=="**EOF**" then
               del %DIRECTORY%NoArc.txt > nul
          else
               cls
               beep
               *inkey /K"YN" Создать список файлов не попавших в архив (Y/N) ? %%Var
               if "%Var"=="Y" GoSub NOARC
               list %directory%NoArc.txt
               beep
               *inkey /K"YN" Сохранить его в файле %directory%NoArc.txt (Y/N) ? %%Var
               if "%Var"=="N" del %directory%NoArc.txt > nul
          endiff
          Beep
          *inkey /K"YN" Сохранить сообщения архиватора (Arhiv.txt)? (Y/N) %%Var
          If "%Var%"=="N" Del %DIRECTORY%Arhiv.txt > nul
      endiff

      Iff "%Var%"=="Вернуть в исходное состояние" then
          unset var
          copy %directory%Запасной.zip Главный.zip > nul
          Del %DIRECTORY%Arhiv.txt > nul
          QUIT
      endiff
  else
      del %DIRECTORY%arhiv.txt > nul
      If «%WinDir» != «» setdos /i-attrib
      attrib -A "%Disk%\%DATA" /s
  endiff
 
endiff
 
echo %_date > %DIRECTORY%archiv.log
quit


:NOARC - Определение незаархивированных файлов.
: Начала процедуры (начиная со строк UNSET VAR и FIND), находится в основной
: программе, поскольку остальная часть вызывается только при
: положительном ответе на содержащийся в первой части запрос – программа
: удлиняется, становится более запутанной, но выполняется быстрее
: (Возможно это не верный подход).
echo %@substr[%file,%@len[%WARNING]] >> %DIRECTORY%NoArc.tmp
set NUM=%@Eval[%num+1]
if not "%File"=="**EOF**" goto NOARC
del %directory%NoArc.txt > nul
set NUM=0
set FILE=%@Line[%DIRECTORY%NoArc.tmp,%num]
iff "%file"=="**EOF**" then
    beep
    echo Не удалось прочесть временный файл списка - "NoArc.tmp" или он пуст.
    *pause^del %DIRECTORY%NoArc.tmp > nul
    RETURN
endiff

:ReWRITE
: ________________________________________________________________
:CIKL1  Этот фрагмент только для PkUnZip (замена знака / на знак \)
set POZ=%@index[%file,/]
IFF "%POZ%" != "-1" then
    set File1=%FILE1%%@substr[%file,0,%poz]\
    set File=%@substr[%file,%@Eval[%poz+1]]
    if "%@index[%file,/]" != "-1" GoTo CIKL1
    set File=%File1%%file
    unset file1
endiff
: ________________________________________________________________
 
echo %File >> NoArc.txt
set NUM=%@Eval[%num+1]
set FILE=%@Line[%DIRECTORY%NoArc.tmp,%num]
if not "%File"=="**EOF**" goto ReWRITE
del %directory%NoArc.tmp > nul
 
RETURN


:ReArc
echo Некоторые файлы небыли заархивированы.
beep
set Var=N
echo Отобразить их список? (Y/N)
*inkey /W10 Жду десять секунд и продолжаю без списка. %%Var
iff "%var" != "N" then
    unset Var
    find /i "%WARNING" %directory%arhiv.txt > %directory%NoArc.txt
    unset cmdline
    : Удаление подстроки "PKZIP: (W02) Warning! can't open:"
    : Поиск начинается со строки 2 поскольку строки 0 и 1,
    : выдаваемые программой Find никому не нужны
    set NUM=2
    set FILE=%%@Line[%DIRECTORY%NoArc.txt,%%num]
    iff "%file"=="**EOF**" then
        del %DIRECTORY%NoArc.txt > nul
        beep
        echo Ошибка при создании списка файлов непопавших в архив
        *pause
    else
        GoSub NOARC
        list %directory%NoArc.txt
        beep
        *inkey /K"YN" Сохранить его в файле %directory%NoArc.txt (Y/N) ? %%Var
        if "%Var"=="N" del %directory%NoArc.txt > nul
    endiff
EndIff
set Var=Y
echo Попытатся добавить их к архиву? (Y/N)
*inkey /W300 Жду пять минут и пытаюсь сам. %%Var
iff "%var"=="Y" then
    find /i "%WARNING" %directory%arhiv.txt > %directory%NoArc.txt
    unset cmdline
    : Удаление подстроки "PKZIP: (W02) Warning! can't open:"
    : Поиск начинается со строки 2 поскольку строки 0 и 1,
    : выдаваемые программой Find никому не нужны
    set NUM=2
    set FILE=%%@Line[%DIRECTORY%NoArc.txt,%%num]
    iff "%file"=="**EOF**" then
        del %DIRECTORY%NoArc.txt > nul
        beep
        echo Ошибка при создании списка файлов непопавших в архив
        *pause
    else
        GoSub NoArc
        pkzip -a+ -pr -Wsh %DIRECTORY%%_dow%zip @%DIRECTORY%NoArc.txt | tee %DIRECTORY%arhiv.txt
        : Крутим динамо либо пока не добьемся положительного результата,
        : либо пока не остановит пользователь
        if errorlevel==18 GoTo ReArc
        del %DIRECTORY%NoArc.txt > nul
    EndIff
EndIff
RETURN

Применение переменных в указанной программе повышает ее гибкость, однако, при их большой величине может привести к ошибкам из-за недостатка памяти в окружении. И, хотя расход памяти окружения программой жестко лимитируется (команды unset удаляют даже переменную CmdLine), назначаемую NDOS по умолчанию величину окружения (512 байт), лучше увеличить параметром /E:1024 в команде вызова или параметром Environment=1024 в файле NDOS.ini.

 

< Глава 27. Глава 28. Эпилог >

 

Комментарии к странице

 

 

 


На главную страницу сайта