1 (изменено: freeZer0K, 2016-10-04 14:07:26)

Тема: AHK: RegFile2Ahk Converter помощь

Добрый день!

Начал скрипт - конвертер регфайлов (*.reg) в *.ahk и столкнулся с некоторыми проблемами.

Код скрипта:


#NoEnv
#NoTrayIcon
#SingleInstance force
SendMode Input
SetBatchLines -1

If !A_IsAdmin
	{
	Run % "*RunAs """ A_ScriptFullPath """"
	ExitApp
	}
	
ProgramName := "RegFile2Ahk Converter"
/*
; SourceDir изменить

GetRegFile:
Title := "Выбор файла реестра для конвертирования"
FileSelectFile RegFile, 3, % SourceDir, % Title, Файлы реестра (*.reg)
If !RegFile
	{
	MsgBox 0x34, % ProgramName, Файл реестра не выбран!`n`nПовторить?
	IfMsgBox Yes
		{
		GoTo GetRegFile
		}
	IfMsgBox No
		{
		ExitApp
		}
	}
*/	
RegFile := A_ScriptDir "\REGISTRY-TEST.reg" ; строка к финальному удалению!

FileRead VType, % RegFile

; удаление Windows Registry Editor Version 5.00
VType := RegExReplace(VType, "i)Windows Registry Editor Version.*?(\R+|$)")

; удаление пустых значений (по-умолчанию)
VType := RegExReplace(VType, "@=""""(\R+|$)")

; @="бубль гум" по-умолчанию (marker @="" > REG_SZ)
VType := RegExReplace(VType, "@=""(.*)""", "RegWrite REG_SZ, RegPath,, $1")

; "this_is_REG_SZ"="C:\\Program Files\\Registry Workshop\\RegWorkshop.exe" (marker   =" > REG_SZ)
VType := RegExReplace(VType, """(.*)""=""(.*)""", "RegWrite REG_SZ, RegPath, $1, $2")

; "this_is_REG_DWORD"=dword:00477579 (marker   =dword: > REG_DWORD)
VType := RegExReplace(VType, """(.*)""=dword:(\d+)", "RegWrite REG_DWORD, RegPath, $1, $2")

; "this_is_REG_BINARY"=hex:34,37,37,35,\ (marker   =hex: > REG_BINARY)   !!!!!!!!!!
VType := RegExReplace(VType, """(.*)""=hex:(.*)\\(\R\s+|$)", "RegWrite REG_BINARY, RegPath, $1, $2")

; "this_is_REG_MULTI_SZ"=hex(7):33,00,38,00,\ (marker   =hex(7): > REG_MULTI_SZ)
VType := RegExReplace(VType, """(.*)""=hex\(7\):(.*)\\", "RegWrite REG_MULTI_SZ, RegPath, $1, $2")

; "this_is_REG_EXPAND_SZ"=hex(2):22,00,43,00,\ (marker   =hex(2): > REG_EXPAND_SZ)
VType := RegExReplace(VType, """(.*)""=hex\(2\):(.*)\\", "RegWrite REG_EXPAND_SZ, RegPath, $1, $2")

; "this_is_REG_QWORD"=hex(b):34,37,37,35 (marker   =hex(b): > REG_QWORD)
VType := RegExReplace(VType, """(.*)""=hex\(b\):(\d+)", "RegWrite REG_QWORD, RegPath, $1, $2")

; удаляемые разделы
VType := RegExReplace(VType, "i)\[-(HKEY_\w+)\\(.*)\](\R|$)", "RegDelete $1, $2`n")
; удаляемые параметры
VType := RegExReplace(VType, "m`a)(@=-.*)|("".*""=-.*)", ";$1$2`t- удаление параметров запрещено в Windows 10")


Loop parse, % VType, `n, `r
	{
	Loop
		{
		If A_LoopField contains [HKEY_
			{
			NewRegPath := RegPath(RegPathAhk) ; преобразование path реестра в формат ahk
			break
			}
			Else
				{
				RegStrAhk := A_LoopField
				If InStr(RegStrAhk, "\\") ; замена double backslash на один и удаление \" \"  (проверить после правки шаблонов)
					{
					RegStrAhk := RegExReplace(StrReplace(RegStrAhk, "\\", "\", "All"), "(.*)\\""(\w:\\.*)\\""", "$1$2")
					}
				If InStr(RegStrAhk, "Program Files") ; замена C:\Program Files на переменную
					{
					RegStrAhk := RegExReplace(RegStrAhk, "(.*)\w:\\Program Files(.*)", "$1 % ProgramFiles ""$2""")
					}
				RegStrAhk := StrReplace(RegStrAhk, "RegPath", NewRegPath, "All") ; замена marker "RegPath" на реальный path AHK
				GoSub Print
				break
				}
		}
	}
	
ExitApp

Print:
SplitPath RegFile,,,, RegFileNoExt
FileAppend
	(
	% RegStrAhk "`n"
	), % RegFileNoExt ".ahk", UTF-8
return

; functions
RegPath(RegPathAhk)
	{
	RegPathAhk := RegExReplace(A_LoopField, "i)\[HKEY_CLASSES_ROOT\\(.*)\]", "HKCR, $1")
	RegPathAhk := RegExReplace(RegPathAhk, "i)\[HKEY_CURRENT_USER\\(.*)\]", "HKCU, $1")
	RegPathAhk := RegExReplace(RegPathAhk, "i)\[HKEY_LOCAL_MACHINE\\(.*)\]", "HKLM, $1")
	Return RegPathAhk
	}

Тестовый файл реестра REGISTRY-TEST.reg:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\TEST-1]
"this_is_REG_SZ-1"="\"C:\\Program Files\\Notepad++\\notepad++.exe\""
"this_is_REG_SZ-2"="C:\\Program Files\\Registry Workshop\\RegWorkshop.exe"
"this_is_REG_SZ-3"="Shutdown;Reboot;Hibernate;LogOff"

Тестовый код:

VType =
(
"this_is_REG_SZ-1"="\"C:\\Program Files\\Notepad++\\notepad++.exe\""
"this_is_REG_SZ-2"="C:\\Program Files\\Registry Workshop\\RegWorkshop.exe"
"this_is_REG_SZ-3"="Shutdown;Reboot;Hibernate;LogOff"
)

msgbox % VType := RegExReplace(VType, "`a)""(.*)""=""\\?(.*)""", "RegWrite REG_SZ, RegPath, $1, $2")

Дает такой результат:


RegWrite REG_SZ, RegPath, this_is_REG_SZ-1, "C:\\Program Files\\Notepad++\\notepad++.exe\"
RegWrite REG_SZ, RegPath, this_is_REG_SZ-2, C:\\Program Files\\Registry Workshop\\RegWorkshop.exe
RegWrite REG_SZ, RegPath, this_is_REG_SZ-3, Shutdown;Reboot;Hibernate;LogOff

Задача этого шаблона преобразовать все строки переменной VType в такие:

RegWrite REG_SZ, RegPath, this_is_REG_SZ-1, "C:\\Program Files\\Notepad++\\notepad++.exe"
RegWrite REG_SZ, RegPath, this_is_REG_SZ-2, C:\\Program Files\\Registry Workshop\\RegWorkshop.exe
RegWrite REG_SZ, RegPath, this_is_REG_SZ-3, Shutdown;Reboot;Hibernate;LogOff

Как удалить последний \ в строке ... notepad++.exe\"?

2

Re: AHK: RegFile2Ahk Converter помощь

1) Почитать как добавляются по-дефалту новые строки в continuation section.
2) Почитать про опцию s) в регулярных выражениях.

3

Re: AHK: RegFile2Ahk Converter помощь

freeZer0K
Такое выражение: "`amU)""(.*)""=""[""\\]*?(.+)\\?""*$"

4 (изменено: freeZer0K, 2016-10-04 15:48:27)

Re: AHK: RegFile2Ahk Converter помощь

Блоагодарю, Flasher!
Единственное что, этот шаблон бреет напрочь все ", а хотелось бы их оставить там, где путь указан с двойными кавычками, типа:
"C:\\Program Files\\Notepad++\\notepad++.exe"

В оригинале это строка 1 в переменной VType.

В строке 2 путь указан без "
C:\\Program Files\\Registry Workshop\\RegWorkshop.exe

Благодарю за помощь!

5

Re: AHK: RegFile2Ahk Converter помощь

msgbox % VType := RegExReplace(VType, "`a)""(.*)""=""\\?(.+)\\?""", "RegWrite REG_SZ, RegPath, $1, $2")

6 (изменено: freeZer0K, 2016-10-04 16:10:17)

Re: AHK: RegFile2Ahk Converter помощь

Malcev, благодарю, я так уже тестил - тоже оставляет последний \ , затем нужная " ...

Думаю, не плавить мозги, все-равно пути потом менять на переменные в формат ahk, а в них добавить везде двойные кавычки , т.к. без " винда обычно всегда лягается.

7

Re: AHK: RegFile2Ahk Converter помощь

msgbox % VType := RegExReplace(VType, "`a)""(.*)""=""\\?(.+?)\\?""", "RegWrite REG_SZ, RegPath, $1, $2")

8 (изменено: freeZer0K, 2016-10-04 16:27:12)

Re: AHK: RegFile2Ahk Converter помощь

Malcev !!! СПАСИБЫ !!! - ВОТ ТАКОЙ!

Немного не додумал шаблон .... теперь все намана!

9 (изменено: Flasher, 2016-10-04 20:50:53)

Re: AHK: RegFile2Ahk Converter помощь

freeZer0K пишет:

Единственное что, этот шаблон бреет напрочь все

А я спецом так сделал. Не понял, какой смысл в кавычках в первом пути, если их нет во втором.

10

Re: AHK: RegFile2Ahk Converter помощь

freeZer0K пишет:

AHK: RegFile2Ahk Converter помощь

freeZer0K, обратите внимание на список слов, которые не следует употреблять в заголовках, приведите в порядок.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder