Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удаление строк в REG файле (http://forum.oszone.net/showthread.php?t=216455)

gen0m.rsw 26-09-2011 00:51 1760118

Удаление строк в REG файле
 
"Плотно сижу" на 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 1760218

gen0m.rsw, ближе к вечеру (по MSK) выложу.

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

1) файл реестра валидный — сигнатура:
Код:

Windows Registry Editor Version 5.00


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

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

REGEDIT4


версии?

SendMessage 26-09-2011 16:29 1760451

Если я правильно понял задачу:

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

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 1760514

SendMessage, вечером сравним результаты ;).

gen0m.rsw 26-09-2011 22:38 1760703

Iska
Енто я понял, просто не хотел писать лишнего, кто знает тот поймёт!!!
Windows Registry Editor Version 5.00 (Енто понятно что не дописал!!)

SendMessage, не могли ты объяснить вкратце как им пользоваться???
Цитата:

Цитата SendMessage
Файл считывается полностью »

Да!

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

SendMessage 27-09-2011 13:41 1760998

Цитата:

Цитата gen0m.rsw
не могли ты объяснить вкратце как им пользоваться??? »

В строку
Код:

strFileName = "z:\tmp\1.reg"
вместо z:\tmp\1.reg вставьте нужный Вам рег-файл. Запустите и смотрите результат (файл не перезапишется, а рядом с ним будет создан файл с тем же именем и расширением REG_ - это и будет отредактированный файл). Да, если не знаете, тот код, что я написал, сохраните в текстовом редакторе с расширением VBS. Его можно запустить двойным кликом. Скрипт написан для тестирования Вами. Потом можно переделать для удобного запуска из комстроки или как Вам угодно.
Цитата:

Цитата gen0m.rsw
Цитата SendMessage:
Файл считывается полностью »
Да! »

Я имел в виду, что скриптом редактируемый файл полностью загружается в память, а не читается последовательными блоками.
Цитата:

Цитата gen0m.rsw
Енто я понял, просто не хотел писать лишнего, кто знает тот поймёт!!!
Windows Registry Editor Version 5.00 (Енто понятно что не дописал!!) »

Из приведенного Вами куска рег-файла совсем не следует, что он 5 версии. А разница между ними для обработки скриптом большая - новый в юникоде, а старый в ASCII.

Iska 27-09-2011 14:48 1761046

SendMessage, работает.

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

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

gen0m.rsw 28-09-2011 14:39 1761775

SendMessage, респеск!!!
Пока глюков не было!

gen0m.rsw 28-09-2011 15:02 1761788

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 1761914

gen0m.rsw, ручной путь подсказать (нужна будет установка стороннего приложения)?


Время: 18:50.

Время: 18:50.
© OSzone.net 2001-