Войти

Показать полную графическую версию : Удаление строк в REG файле


gen0m.rsw
26-09-2011, 00:51
"Плотно сижу" на Advanced Installer, естественно приходится добавлять записи в реестр, вот какая проблема!
После экспорта/сохранения из многих программ получается примерно такие reg-файлы (пример)

[HKEY_LOCAL_MACHINE\SOFTWARE]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers]
@="1"

При импорте в Advanced Installer енто недопустимо(ошибки при удалении)
Хотелось бы что в файле реестра удалялись , так называемые пустые разделы, кроме последнего( и конечно параметры).
А то приходиться руками чистить(бывало reg-файл доходил до 2500 строк :( )

Iska
26-09-2011, 10:02
gen0m.rsw, ближе к вечеру (по MSK) выложу.

Сразу уточню:

1) файл реестра валидный — сигнатура:
Windows Registry Editor Version 5.00


наличествует?

2) работать будем только с пятой версией или потребуется поддержка и старой:
REGEDIT4


версии?

SendMessage
26-09-2011, 16:29
Если я правильно понял задачу:

Файл считывается полностью. В оправдание могу сказать, что скрипт нормально отработал на файле, включающем в себя весь реестр.
Option Explicit

Dim objRegExp
Dim objFSO
Dim RegFile
Dim strText
Dim strFileName
Dim BOM
Dim valFormat

strFileName = "z:\tmp\1.reg"

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set RegFile = objFSO.OpenTextFile(strFileName)
BOM = RegFile.Read(2)
RegFile.Close

If BOM = Chr(&HFF) & Chr(&HFE) Then
valFormat = -1
Else
valFormat = 0
End If

Set RegFile = objFSO.OpenTextFile(strFileName, 1, False, valFormat)
strText = RegFile.ReadAll
RegFile.Close

Set objRegExp = New RegExp

With objRegExp
.Global = True
.IgnoreCase = True
.Pattern = "\[HKEY_.+?\](?:\r\n)+(?=\[HKEY_|$)"
strText = .Replace(strText, "")
End With

Set RegFile = objFSO.OpenTextFile(strFileName & "_", 2, True, valFormat)
RegFile.Write strText
RegFile.Close

Set RegFile = Nothing
Set objFSO = Nothing
Set objRegExp = Nothing

WScript.Echo "Обработка завершена."

WScript.Quit 0

Iska
26-09-2011, 17:54
SendMessage, вечером сравним результаты ;).

gen0m.rsw
26-09-2011, 22:38
Iska
Енто я понял, просто не хотел писать лишнего, кто знает тот поймёт!!!
Windows Registry Editor Version 5.00 (Енто понятно что не дописал!!)

SendMessage, не могли ты объяснить вкратце как им пользоваться???
Файл считывается полностью »
Да!

Надеюсь меня MODER-ы простят, забыл как в "личку" писать(ПОМОГИТЕ), хотелось бы дать какой нибудь "ЖЕСТОКИЙ" оригинал для ТЕСТА, если не против!!!

SendMessage
27-09-2011, 13:41
не могли ты объяснить вкратце как им пользоваться??? »
В строку strFileName = "z:\tmp\1.reg"вместо z:\tmp\1.reg вставьте нужный Вам рег-файл. Запустите и смотрите результат (файл не перезапишется, а рядом с ним будет создан файл с тем же именем и расширением REG_ - это и будет отредактированный файл). Да, если не знаете, тот код, что я написал, сохраните в текстовом редакторе с расширением VBS. Его можно запустить двойным кликом. Скрипт написан для тестирования Вами. Потом можно переделать для удобного запуска из комстроки или как Вам угодно.
Цитата SendMessage:
Файл считывается полностью »
Да! »
Я имел в виду, что скриптом редактируемый файл полностью загружается в память, а не читается последовательными блоками.
Енто я понял, просто не хотел писать лишнего, кто знает тот поймёт!!!
Windows Registry Editor Version 5.00 (Енто понятно что не дописал!!) »
Из приведенного Вами куска рег-файла совсем не следует, что он 5 версии. А разница между ними для обработки скриптом большая - новый в юникоде, а старый в ASCII.

Iska
27-09-2011, 14:48
SendMessage, работает.

Я не сообразил подходящего регулярного выражения, делал построчным чтением. Разница в результатах на четыре байта (в длине, не в содержимом) при оригинале ~310 тысяч строк (HKCR цельным куском) ;). В скорости мой вариант намного медленнее. Уже посему, думаю, выкладывать не стоит.

Снимаю шляпу!

gen0m.rsw
28-09-2011, 14:39
SendMessage, респеск!!!
Пока глюков не было!

gen0m.rsw
28-09-2011, 15:02
SendMessage, возникла ещё проблемка по поводу дубликатов!

[HKEY_LOCAL_MACHINE\SOFTWARE\ProXima\comedy\1.0]
"Editor"="notepad.exe"
"chain"=dword:00000000
"ignore"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\ProXima\comedy\1.0]
"Editor"="notepad.exe"

Попадаются одинаковые разделы и параметры, нельзя енто как до править в существующем VBS ?

Iska
28-09-2011, 18:03
gen0m.rsw, ручной путь подсказать (нужна будет установка стороннего приложения)?




© OSzone.net 2001-2012