Тема: 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\"?

