Что нового

[Автоматизация] Удаление повторяющихся строк с особым условием

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Нужен алгоритм удаления повторяющихся строк в reg-файле
имеем к примру образец
[HKEY_CLASSES_ROOT\htmlfile]
[HKEY_CLASSES_ROOT\htmlfile\BrowseInPlace]
[HKEY_CLASSES_ROOT\htmlfile\CLSID]
[HKEY_CLASSES_ROOT\htmlfile\DefaultIcon]
[HKEY_CLASSES_ROOT\htmlfile\ScriptHostEncode]

нужно удалить все строки кроме [HKEY_CLASSES_ROOT\htmlfile], это нужно для экспорта по данным рег-файла.
Есть два варианта
1. Копирую данные файла в переменную и одновременно копирую их же в массив построчно. Далее создаю цикл в котором проверяется каждяй элемент массива, то есть беру элемент массива [HKEY_CLASSES_ROOT\htmlfile] и проверяю есть ли строка [HKEY_CLASSES_ROOT\htmlfile\ в переменной файла, если да, то удаляется.
Но проблема, в том, что неизвестно количество элементов массива, так как он был разбит регулярным выражением $aRegfileT1 = StringRegExp($regfileT1, "(\[HK.*?\])", 3)
Есть возможность отправить его в буфер обмена _ArrayToClip и оттуда разбать используя StringSplit в котором уже будет количество элементов в массива в первом элементе $array[0].
Но неужели нельзя это сделать проще?

2. Ещё варинат: хотел выполнить цикл, типа такого:
Код:
$tt=''
$d=0
While 1
	If Not IsDeclared ("regfileT1[$d]") then ExitLoop
	$tt&=$regfileT1[$d]&@CRLF
	$d=+1
WEnd

то есть объединения массива, в принципе и количество элементов можно было бы посчитать, но как отработать строке IsDeclared ("regfileT1[$d]"), то есть проверка существования элемента массива?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO
а в одном регфайле других "нужных" строк, которые удалять не надо более нет?
и правильно ли я понял, что "нужная" строка самая короткая? либо она самая первая? либо "нужных" строк в файле много, но все они идут после [HKEY_CLASSES_ROOT\...]?
одним словом, как идентифицировать неудаляемую строку?
 

SyDr

Сидра
Сообщения
651
Репутация
158
AZJIO [?]
1. Копирую данные файла в переменную и одновременно копирую их же в массив построчно. Далее создаю цикл в котором проверяется каждяй элемент массива, то есть беру элемент массива [HKEY_CLASSES_ROOT\htmlfile] и проверяю есть ли строка [HKEY_CLASSES_ROOT\htmlfile\ в переменной файла, если да, то удаляется.
Но проблема, в том, что неизвестно количество элементов массива, так как он был разбит регулярным выражением $aRegfileT1 = StringRegExp($regfileT1, "(\[HK.*?\])", 3)
Размерность массива - UBound
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Kaster
Нужная строка самая короткая, так как все экспортированные строки объеденяются в один рег-файл. Поэтому мне не нужно экспортировать ещё и подветки, они экспортируются более короткой строкой.
Количество строк и имена веток самые разнообразные другими словами весь реестр.
Скрипт при старте предлагает выбрать reg-файл, по данным этого рег файла он экспортирует аналогичные ветки из реестра. Скрипт уже готов и выполняет это, но у него проблема в том, что он выполняет экспорт всех веток без разбора, включая и подветки. Выходной бэкап-файл получается иногда громоздкий, поэтому я хочу выполнить удаление подветок перед началом экспорта.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO
так я не понял. ты из
Код:
[HKEY_CLASSES_ROOT\htmlfile]
[HKEY_CLASSES_ROOT\htmlfile\BrowseInPlace]
[HKEY_CLASSES_ROOT\htmlfile\CLSID]
[HKEY_CLASSES_ROOT\htmlfile\DefaultIcon]
[HKEY_CLASSES_ROOT\htmlfile\ScriptHostEncode]
хочешь получить вот это
Код:
[HKEY_CLASSES_ROOT\htmlfile]
или это
Код:
[HKEY_CLASSES_ROOT\htmlfile]
\BrowseInPlace]
\CLSID]
\DefaultIcon]
\ScriptHostEncode]
?
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
это
[HKEY_CLASSES_ROOT\htmlfile]

в принципе от SyDr получил частичный ответ, на много упрощающий дело
For $i = 0 to UBound($aRegfileT1) - 1

думаю регулярным выражением замену не сделать, все равно придётся прорядить список веток по-элементно.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
я бы порекомендовал сразу экспортировать в нужном формате, а не редактировать файл после экспорта. но если файлы уже сформированы, то попробуй следующее
Код:
$sRegPath = 'path to the reg-file'
$sRegPath_tmp = 'new/temp path to edited reg-file'
;$sRegPath = @ScriptDir & '\reg.reg'
;$sRegPath_tmp = @ScriptDir & '\new.reg'
$hRegRead = FileOpen($sRegPath, 0)
$hRegWrite = FileOpen($sRegPath_tmp, 2)

While 1
   $sLine = FileReadLine($hRegRead)
   if @error = -1 Then ExitLoop
   If StringRegExp($sLine, '\[HKEY_CLASSES_ROOT\\[^\s\\]+\]') Then FileWriteLine($hRegWrite, $sLine)
WEnd
FileClose($hRegRead)
FileClose($hRegWrite)
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Kaster
дело не в [HKEY_CLASSES_ROOT...], я же говорю, ВЕСЬ реестр.
Вот первый набросок, который выдал необходимое, осталось доводить...
Код:
$regfileT = FileOpen($regfile, 0) ; открываем бэкапируемый файл для чтения
$regfileT1= FileRead($regfileT)
FileClose($regfileT)
$regfileT1=StringRegExpReplace($regfileT1,"(?s)\[[^\]]+\]\s{4,}","") ; удаление пустых секций
$aRegfileT1 = StringRegExp($regfileT1, "(\[HK.*?\])", 3) ; создание массива веток реестра

$regfileT1=''

For $i = 0 to UBound($aRegfileT1) - 1 ; объединение массива в многостроковый файл
$regfileT1&=$aRegfileT1[$i]&@CRLF
Next

For $i = 0 to UBound($aRegfileT1) - 1 ;чистка повторов подветок
$vetka1 = StringTrimRight($aRegfileT1[$i ], 1)
$vetka1 = StringReplace($vetka1, "\", "\\")
$regfileT1=StringRegExpReplace($regfileT1,'\'&$vetka1&'\\.*',"") 
Next

MsgBox(0,"Проверка", $regfileT1) 
Exit


я бы порекомендовал сразу экспортировать в нужном формате, а не редактировать файл после экспорта.
Обьясню понятней. Я собираюсь добавить данные в реестр из рег файла скопированного где нибудь в инете, который содержит конфигурацию какой нибудь программы. Но я не уверен, что после добавления этих данных я обрадуюсь, что у меня прога стала вылетать. Понятно что для этого существуют контрольные точки, но может я просто хочу сохранить свой конфиг по конкретной проге.
Так вот этот скрипт при старте требует указать ему подопытный рег-файл, если указать, то он вернёт новый регфайл с теми же данными, но из моего реестра. То есть запустив его я восстановлю настройки. А также создаётся файл для удаления тех веток, которые были добавлены в реестр, но их не было в моём реестре. Вот весь смысл.

Неоптимизированная рабочая версия этого скрипта есть в архиве, который я уже выкладывал, файл "reg-backup - бэкапирует из реестра по рег-файлу.au3"
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO [?]
я же говорю, ВЕСЬ реестр
А что ты собираешься удалять в других разделах? тоже все подветки? ну к примеру
Код:
[HKEY_LOCAL_MACHINE\HARDWARE]
[HKEY_LOCAL_MACHINE\HARDWARE\ACPI]
[HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION]
оставишь только
Код:
[HKEY_LOCAL_MACHINE\HARDWARE]
?
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Kaster
Да правильно. Кстати, вот готовый пример, уже проверил, далее остаётся упрощать и оптимизировать.
Скрипт обновил (5 раз)
Код:
;  @AZJIO 25.03.2010

; основные параметры скрипта
$tempfile=@TempDir&'\temporarily.reg'
$razdelit='#==========================' ; разделяет экспортированные ветки, количество тоже, что веток в файле удаления
$del=1 ;ключ 1 - создавать файл удаления веток, 0 - не создавать

$close = RegRead("HKCR\regfile\shell\mbackup", '')
If @error=1 Then
	;регистрация в реестре и копирование в системную папку, при первом запуске
RegWrite("HKCR\regfile\shell\mbackup","","REG_SZ","Бэкапировать reg")
RegWrite("HKCR\regfile\shell\mbackup\command","","REG_SZ",@AutoItExe&' "'&@SystemDir&'\reg-backup.au3" "%1"')
If Not FileExists(@SystemDir&'\reg-backup.au3') Then FileCopy(@ScriptDir&'\reg-backup.au3', @SystemDir,1)
EndIf

;Добавление $sTarget позволило использовать скрипт в контекстном меню
If $CmdLine[0]=0 Then
	$regfile = FileOpenDialog("Выбор файла *.reg, для которого будет выполнен бэкап.", @ScriptDir & "", "reg-файл (*.reg)", 1 + 4 )
	If @error Then Exit
Else
$regfile=$CmdLine[1]
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


Смысл в том что скрипт экспортирует каждую ветку найденную в рег-файле. А так как там много подветок, то одни и теже данные экспортируются многократно.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
$sRegPath = 'path to the reg-file'
$sRegPath_tmp = 'new/temp path to edited reg-file'
;$sRegPath = @ScriptDir & '\reg.reg'
;$sRegPath_tmp = @ScriptDir & '\new.reg'
$hRegRead = FileOpen($sRegPath, 0)
$hRegWrite = FileOpen($sRegPath_tmp, 2)

While 1
   $sLine = FileReadLine($hRegRead)
   if @error = -1 Then ExitLoop
   If StringRegExp($sLine, '\[HK[^\s\\]+\\[^\s\\]+\]') Then FileWriteLine($hRegWrite, $sLine)
WEnd
FileClose($hRegRead)
FileClose($hRegWrite)

потом проверь создавшийся файл. то ли это
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Kaster
Неа, даже далеко не близко... )))))
Просто возвращает короткую строку.
Попробуй мой скрипт в предыдущем посте, на любом рег-файле. Появятся два файла с датой создания. В одном копия реестра, в другом строки для удаления этих данных.
Для такого куска
[HKEY_CURRENT_USER\Control Panel\Appearance]
[HKEY_CURRENT_USER\Control Panel\Appearance\New Schemes]
[HKEY_CURRENT_USER\Control Panel\Appearance\New Schemes\Current Settings SaveAll]
[HKEY_CURRENT_USER\Control Panel\Appearance\New Schemes\Current Settings SaveAll\Sizes]
[HKEY_CURRENT_USER\Control Panel\Appearance\New Schemes\Current Settings SaveAll\Sizes\0]
[HKEY_CURRENT_USER\Control Panel\Desktop]
[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Components]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Components\0]
[HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer]
[HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Preferences]
[HKEY_CURRENT_USER\Software\Microsoft\Windows]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ThemeManager]
возвращаться должны
[HKEY_CURRENT_USER\Control Panel\Appearance]
[HKEY_CURRENT_USER\Control Panel\Desktop]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer]
[HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer]
[HKEY_CURRENT_USER\Software\Microsoft\Windows]

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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO [?]
Неа, даже далеко не близко... )))))
странное дело. он из куска регфайла, который в шапке темы делает то, что указано опять же в шапке темы. цитирую

[?]
Нужен алгоритм удаления повторяющихся строк в reg-файлеимеем к примру образец
Код:
[HKEY_CLASSES_ROOT\htmlfile]
[HKEY_CLASSES_ROOT\htmlfile\BrowseInPlace]
[HKEY_CLASSES_ROOT\htmlfile\CLSID]
[HKEY_CLASSES_ROOT\htmlfile\DefaultIcon]
[HKEY_CLASSES_ROOT\htmlfile\ScriptHostEncode]
нужно удалить все строки кроме [HKEY_CLASSES_ROOT\htmlfile], это нужно для экспорта по данным рег-файла.
я создал файл reg.reg со следующим содержимым (просто для проверки)
Код:
[HKEY_CLASSES_ROOT\htmlfile]
[HKEY_CLASSES_ROOT\htmlfile\BrowseInPlace]
[HKEY_CLASSES_ROOT\htmlfile\CLSID]
[HKEY_CLASSES_ROOT\htmlfile\DefaultIcon]
[HKEY_CLASSES_ROOT\htmlfile\ScriptHostEncode]

[HKEY_CLASSES_ROOT\docfile]
[HKEY_CLASSES_ROOT\docfile\BrowseInPlace]
[HKEY_CLASSES_ROOT\docfile\CLSID]
[HKEY_CLASSES_ROOT\docfile\DefaultIcon]
[HKEY_CLASSES_ROOT\docfile\ScriptHostEncode]

[HKEY_CLASSES_ROOT1\docfile]
[HKEY_CLASSES_ROOT1\dicfile\BrowseInPlace]
[HKEY_CLASSES_ROOT1\docfile\CLSID]
[HKEY_CLASSES_ROOT1\docfile\DefaultIcon]
[HKEY_CLASSES_ROOT1\docfile\ScriptHostEncode]
и запустил на нем скрипт и получил
Код:
[HKEY_CLASSES_ROOT\htmlfile]
[HKEY_CLASSES_ROOT\docfile]
[HKEY_CLASSES_ROOT1\docfile]
если это не то, что требовалось, то ты где-то себе противоречишь
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Kaster
Я имел в виду работу скрипта не на патерне, а во всех допустимых вариантах, может не полноценно выразил смысл. Но не зря я тестил, сейчас обнаружил проблему скрипта в регулярном выражении (?s)\[[^\]]+\]\s{4,}
Выложенный мной патерн отработал не правильно, он должен был удалить все секции, так как они пустые, а вернул первую строчку. Но это наверно вопрос уже для новой темы...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
скажи - верно ли такое утверждение, что сначала всегда идет главная ветвь, и только после ее подветки?
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Kaster [?]
Только ты вот что скажи - верно ли такое утверждение, что сначала всегда идет главная ветвь, и только после ее подветки?
Нет. Например, ручное редактирование файла при котором не соблюдается это правило, а для regedit не имеет значание, он последовательно вносит данные. То есть нужно не только поиск вниз, но и вверх, а проще весь файл.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO [?]
Нет. Например, ручное редактирование файла при котором не соблюдается это правило
тогда мне представляется очень сложным решение твоей задачи.
например
Код:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
[HKEY_CURRENT_USER\Control Panel\Appearance\New Schemes]
[HKEY_CURRENT_USER\Control Panel\Appearance\New Schemes\Current Settings SaveAll\Sizes]
[HKEY_CURRENT_USER\Control Panel\Desktop]
[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Components]
[HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Preferences]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ThemeManager]
[HKEY_CURRENT_USER\Control Panel\Appearance\New Schemes\Current Settings SaveAll]
[HKEY_CURRENT_USER\Software\Microsoft\Windows]
[HKEY_CURRENT_USER\Control Panel\Appearance\New Schemes\Current Settings SaveAll\Sizes\0]
[HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer]
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Components\0]
[HKEY_CURRENT_USER\Control Panel\Appearance]
как ты в таком куске хочешь определить, что есть родительская ветка для
Код:
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Components\0]
то-ли
Код:
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\
или
Код:
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer


Добавлено:
Сообщение автоматически объединено:

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

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Kaster
в противном случае, решение, в случае наличия таковой, будет очень громоздким, время исполнения которой будет возрастать как Size! (факториал), т.к. нужно будет каждый раз проходить по названием веток и подветок.
В моем решении количество проходов равно количеству веток, при чём регулярное выражение отрабатывает на удивление очень быстро, основное торможение происходит при экспорте, то есть от количества экспортов.
Я уже сталкивался с проблемой скорости, например StringMid отрабатывает 178 раз в сек, в то время как регулярное выражение выполняется мгновенно.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO
в таком случае могу предложить немного оптимизированный вариант твоего скрипта, если он тебя устраивает
Код:
$sRegPath = @ScriptDir & '\reg.reg'
$sContent = FileRead($sRegPath)
$aContent = StringSplit(StringReplace($sContent, @CR, ''), @LF)
For $i = 1 to $aContent[0]
	$sReg = StringTrimRight($aContent[$i], 1)
	$sReg = StringReplace($sReg, "\", "\\")
	$sContent=StringRegExpReplace($sContent,'\'&$sReg&'\\.*',"")
	$sContent=StringRegExpReplace($sContent,'\n\n',"")
Next
MsgBox(0,"Проверка", $sContent)
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
Обновил скрипт. В строках 48-68 происходит удаление повторяющихся строк (цикл в строках 61-68). Алгоритм при более 250 выходных строк отрабатывает за 2 сек, а 10000 строк на 13 сек. Принцип: удаление каждой строчки из образца, включая повторы и дописывание этой строчки в конец образца.
 
Верх