ТаблицейБлоками.Оптимизация и спасение IBM PC: Резервное копирование |
Последняя модификация: 10.08.2014 г
Страница загружена с адреса: http://comp.site3k.ru/ibmpc/chaptr28.html
Не смотря на множество способов восстановления данных, лучшим способом их защиты является резервное копирование. В нем тоже, способов не счесть.
Во первых, его можно выполнять либо вручную, либо с помощью специальных программ. Применение специальных программ облегчает процесс.
Во вторых, его можно выполнять со сжатием, либо без. Сжатие позволяет экономить место.
В третьих, копировать можно либо целиком, весь диск, либо выборочно. Выборочное копирование экономит не только место, но и время.
Для выборочного копирования могут применяться различные программы:
Программы поиска различных файловых менеджеров (в том числе, программа поиска входящая в состав Windows), позволяют найти все файлы желаемого типа, после чего, требуемые из них, можно выделить и скопировать. Однако использование подобного резерва окажется крайне неудобным, поскольку в нем не сохранится информация об исходном расположении файлов.
Сохранить информацию об исходном расположении, позволяет копирование непосредственно из программ-архиваторов: необходимо дать команду добавить в архив (или создать архив) и в появившемся окне выбора файлов для архивации, ввести требуемый шаблон. Если требуется, следует отметить опцию включая вложенные папки и (в зависимости от особенностей программы), отдельно указать, что выбор происходит по шаблону.
Однако, архивация по шаблону не всегда удобна. Иногда более удобен выбор конкретных объектов, и, если они находятся в одном каталоге, он может производиться как в архиваторе, так и в обычном файловом менеджере, например, Explorer (с последующим выбором пункта архивации из контекстного меню). Проблемы возникают только тогда, когда желаемые файлы находятся в разных папках. Из множества существующих программ для резервного копирования, архивацию файлов сразу из нескольких каталогов, не вложенных друг в друга, поддерживают только единицы, в остальных же, процедуру архивации приходиться выполнять в несколько (десятков) приемов, постоянно добавляя файлы к созданному архиву, от чего не трудно и запутаться.
Одной из немногих программ, позволяющих одним приемом заархивовать файлы из нескольких независимых источников (возможно, в графическом варианте, таких программ всего две), является программа Backup, входящая в состав Windows. У нее есть три существенных недостатка:
Этих недостатков лишена программа 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, теряя исходное имя. Но для решения этой проблемы существует два способа:
Подключается список командой вида: 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. Эпилог >
