ТаблицейБлоками.Оптимизация и спасение 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. Эпилог >