Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 2)

Модерирует : gyra, Maz

Widok (01-06-2010 13:08): Лимит страниц. Продолжаем здесь.  Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

AZJIO



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
;  @AZJIO 19.03.2010
 
; основные параметры скрипта

$regfile = @ScriptDir&'\regbak.reg'
$tempfile=@TempDir&'\temporarily.reg'
$razdelit='#==========================' ; разделяет экспортированные ветки, количество тоже, что веток в файле удаления
$del=1 ;ключ 1 - создавать файл удаления веток, 0 - не создавать
 
;регистрация в реестре и копирование в системную папку, раскомментировать при первом запуске
;RegWrite("HKCR\regfile\shell\management","","REG_SZ","Бэкапировать reg")
;RegWrite("HKCR\regfile\shell\management\command","","REG_SZ",@AutoItExe&' "'&@SystemDir&'\reg-backup.au3" %1')
;If Not FileExists(@SystemDir&'\reg-backup.au3') Then FileCopy(@ScriptDir&'\reg-backup.au3', @SystemDir,1)
 
;Добавление $sTarget позволило использовать скрипт в контекстном меню

$sTarget = StringTrimLeft($CmdLineRaw, StringLen('"'&@ScriptFullPath&'" '))
If $sTarget='' Then
    If Not
FileExists($regfile) Then
        $regfile = FileOpenDialog("Выбор файла *.reg, для которого будет выполнен бэкап.", @ScriptDir & "", "reg-файл (*.reg)", 1 + 4 )
        If @error Then Exit
    EndIf
Else

$regfile=$sTarget
EndIf
 
$aRegfileS = StringRegExp($regfile, "(^.*)\\(.*)$", 3) ; чтобы указать каталог reg-файла для выходных файлов
$aRegfileS1 = StringRegExp($regfile, "(^.*)\\(.*)\.(.*)$", 3)
 
$timer = TimerInit() ; засекаем время
; генерируем имя нового файла с номером копии на случай если файл существует

$i = 1
While FileExists($aRegfileS1[1]&'_BAK'&$i&'.reg') or FileExists($aRegfileS1[1]&'_DEL'&$i&'.reg')
    $i +=1
WEnd
$filename=$aRegfileS1[1]&'_BAK'&$i&'.reg'
$delname=$aRegfileS1[1]&'_DEL'&$i&'.reg'
 
If $del=1 Then
$delfile = FileOpen($aRegfileS[0]&'\'&$delname, 1)
FileWrite($delfile, '#Windows Registry Editor Version 5.00'&@CRLF&@CRLF)
EndIf
 
;оболочка сообщений о ходе процесса если reg-файл 100кб и более
ProgressOn("Бэкапирование", $aRegfileS[1], "1. Очистка подветок, 0 %"&@CRLF&@CRLF&"         @AZJIO 17.03.2010",-1,-1,18)
 
$regfileT = FileOpen($regfile, 0) ; открываем бэкапируемый файл для чтения
$regfileT1= FileRead($regfileT)
FileClose($regfileT)
 ; удаление пустых секций
$regfileT1=StringTrimRight (StringRegExpReplace($regfileT1 & "[","\[[^\]]*\]\s*(?=\[)",""),1)
;$regfileT1=StringRegExpReplace($regfileT1,"(\[.*\])(?=(\s+\[.*|\s+$|$))","")
$aRegfileT1 = StringRegExp($regfileT1, "(\[HK.*?\])", 3) ; создание массива веток реестра
 
$regfileT1=''
For $i = 0 to UBound($aRegfileT1) - 1 ; объединение массива в многостроковый файл
$regfileT1&=$aRegfileT1[$i]&@CRLF
Next
$iaReg=UBound($aRegfileT1) - 1
; чистка подветок, пустых строк, повторов. Файл 1Мб обрабатывается до минуты в этом цикле.
; в тексте удаляется каждый элемент массива и добавляется в конец строки
; Регулярным выражением подготавливается поисковой шаблон, заменяются спец-символы на обрамляющий слеш

For $i = 0 to $iaReg
$regfileT1
=StringRegExpReplace($regfileT1,StringRegExpReplace(StringTrimRight($aRegfileT1[$i], 1), "[][{}()*+?.\\^$|=<>#]", "\\$0")&'(\\.*|\])',"")
If @Extended >0 Then $regfileT1 &= @CRLF&$aRegfileT1[$i]
$ps=Ceiling ($i*100/$iaReg)
ProgressSet( $ps, "1. Очистка подветок, 0 %"&$ps & " %,  ветка: "&$i&' / '&$iaReg&@CRLF&Ceiling(TimerDiff($timer) / 1000) & " сек"&@CRLF&"          @AZJIO 17.03.2010")
Next
$timer0=Ceiling(TimerDiff($timer) / 1000)
$regfileT1=StringRegExpReplace($regfileT1,'\n\r?\n\r?',"") ;удаление пустых строк
 
$aRecords = StringSplit($regfileT1, @CRLF) ; отправляем в массив построчно
 
ProgressSet( 0, "2. Экспорт из реестра, 0 %,  ветка: "&$i&@CRLF&@CRLF&"         @AZJIO 19.03.2010")
$timer1 = TimerInit() ; засекаем время для учёта времени создания экспорта
$filebackup = FileOpen($aRegfileS[0]&'\'&$filename, 1) ; открываем бэкап-файл
FileWrite($filebackup, 'Windows Registry Editor Version 5.00'&@CRLF&@CRLF)
;FileWrite($filebackup, 'REGEDIT4'&@CRLF&@CRLF) ; для win98
If $razdelit<>'' Then $razdelit&=@CRLF
$Data=''
$z=1
if IsInt($aRecords[0]/2) Then ; счётчик строк
    $a=$aRecords[0]/2
Else
    $a=($aRecords[0]-1)/2
EndIf
For
$i=1 To $aRecords[0]
    If StringLeft($aRecords[$i], 3)='[HK' Then ; условие проверки валидности строки в элементе массива
        $temporarily = StringRegExpReplace($aRecords[$i],'\[|\]',"") ; удаление скобок в строке, дабы секция стала веткой
        If $del=1 Then FileWrite($delfile, '[-'&$temporarily&']'&@CRLF)
        $reg1 = RegRead($temporarily, "") ; проверка существования ветки
        If @error=1 Then
            ContinueLoop
        Else

            RunWait ( @Comspec&' /C reg export "'&$temporarily&'" "'&$tempfile&'"', '', @SW_HIDE )
            $vr = FileOpen($tempfile, 0)
            $vr1 = FileRead($vr)
            $vr1 = StringReplace($vr1, "Windows Registry Editor Version 5.00"&@CRLF&@CRLF, $razdelit)
            ;$vr1 = StringReplace($vr1, "REGEDIT4"&@CRLF&@CRLF, $razdelit) ; для win98
            $Data &=$vr1
            FileClose($vr)
        EndIf
    EndIf

    ; статистика: рассчёт полосы прогресса, проверка деления на 2, так как в массиве в 2 раза больше строк
    $ps=Ceiling ($i*100/$aRecords[0])
    if IsInt($i/2) Then $z=$i/2
    ProgressSet( $ps, "2. Экспорт из реестра, "&$ps & " %,  ветка: "&$z&' / '&$a&@CRLF&$timer0&' + '&Ceiling(TimerDiff($timer1) / 1000) & " сек"&@CRLF&"            @AZJIO 17.03.2010")
Next
ProgressOff()
 
FileWrite($filebackup, $Data)
; закрываем файлы
If $del=1 Then FileClose($delfile)
FileClose($filebackup)
 
;если файл пустой, то удаляем его. Добавляется четыре строки и пустой файл равен нескольким байтам.
If FileGetSize($aRegfileS[0]&'\'&$filename)=40 Then FileDelete($aRegfileS[0]&'\'&$filename)
If $del=1 Then
   If
FileGetSize($aRegfileS[0]&'\'&$delname)=41 Then FileDelete($aRegfileS[0]&'\'&$delname)
EndIf

Всего записей: 4413 | Зарегистр. 03-05-2006 | Отправлено: 16:19 23-12-2009 | Исправлено: AZJIO, 14:19 19-03-2010
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 2)
Widok (01-06-2010 13:08): Лимит страниц. Продолжаем здесь.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru