Тема: AHK: RegFile2Ahk Converter - конвертер *.reg файлов в *.ahk
Для тех, кому приходится часто переделывать *.reg файлы в формат AHK скриптов, предлагаю тестирование RegFile2Ahk Converter.
Весь скрипт прокомментирован, старался писать "читабельным кодом".
Приветствуется только конструктивная критика и конкретные предложения и решения по улучшению!
Использование:
1. Запустить скрипт и выбрать нужный файл реестра. На выхлопе в исходной директории получаем файл с тем-же именем *.ahk
или
2. В проводнике, в контекстном меню грызуна на *.reg файлах будет пункт "RegFile2Ahk Converter".
Оригинал reg-файла в любом варианте НЕ удаляется.
Замечание:
Чтобы скрипт работал из контекстного меню мыши, нужно скомпилить его в exe и один раз запустить от имени админа.
СКРИПТ БЕЗ КОМПИЛЯЦИИ ИЗ КОНТЕКСТНОГО МЕНЮ РАБОТАТЬ НЕ БУДЕТ!
Если конвертирование файлов из контекстного меню мыши не планируется, удалите часть кода между:
;______________________________________________________________________________________________
; Context menu
;______________________________________________________________________________________________
Особенности:
* возможность работы с *.reg файлами из контекстного меню мыши.
* старался не оставлять мусор типа @="" и подобное.
* понимает только часто встречающиеся типы параметров и не видит экзотики типа REG_LINK, REG_QWORD и подобные.
* в REG_MULTI_SZ (многострочный) заменяет знак перехода на новую строку в hex-формате на "`n" для AHK-формата.
* теперь конвертирует из hex данных в текст кириллические символы без крякозябр, т.е. также, как и латинские символы.
RegFile2Ahk Converter v2.0:
/*
RegFile2Ahk Converter v2.0
Registry file to *.ahk converter
Copyright © 2018 freeZer0K
*/
#NoEnv
#NoTrayIcon
#SingleInstance force
SendMode Input
SetBatchLines -1
ProgName := "RegFile2Ahk Converter"
; запуск от имени админа (вариант A_IsAdmin не работает с контекстным меню)
RegRead Admin, HKCU, Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers, % A_ScriptFullPath
If ErrorLevel {
RegWrite REG_SZ, HKCU, Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers, % A_ScriptFullPath, RUNASADMIN
}
;______________________________________________________________________________________________
; Context menu
/*
Launch converting *.reg files using context menu item in Windows explorer.
If you want to use it, you have to compile this script to *.exe then once run it as admin.
Remove this part, if you don't need it.
*/
RegRead CntMenu, HKCR, regfile\shell\RegFile2Ahk\command
If (CntMenu != """" A_ScriptFullPath """ ""`%1""") {
RegWrite REG_SZ, HKCR, regfile\shell\RegFile2Ahk, MUIVerb, RegFile2Ahk Converter
RegWrite REG_SZ, HKCR, regfile\shell\RegFile2Ahk, Icon, `%SystemRoot`%\regedit.exe,1
RegWrite REG_SZ, HKCR, regfile\shell\RegFile2Ahk\command,, % """" A_ScriptFullPath """ ""`%1"""
}
RegFile = %1%
If !RegFile {
GoTo GetRegFile
}
Else {
GoTo Make
}
;______________________________________________________________________________________________
GetRegFile:
Title := "Выбор файла реестра для конвертирования"
FileSelectFile RegFile,,, % Title, Файлы реестра (*.reg)
If !RegFile {
MsgBox 0x40024, % ProgName, Файл реестра не выбран!`n`nПовторить?
IfMsgBox Yes, {
GoTo GetRegFile
}
IfMsgBox No, {
ExitApp
}
}
;______________________________________________________________________________________________
Make:
FileRead InData, % RegFile
; удалить строку Windows Registry Editor Version 5.00 + пустую строку ниже
InData := RegExReplace(InData, "i)Windows Registry Editor.*(\R+|$)")
; удалить пустые значения (по-умолчанию)
InData := StrReplace(InData, "@=""""")
; удалить пустые строки, двойные или более пробелы, backslash'и из hex data и "вытянуть" все в одну строку
InData := RegexReplace(InData, "`am)^\s{2,}|\\\R")
; начало конвертирования в AHK формат
; marker @="" > REG_SZ (значение по-умолчанию)
InData := RegExReplace(InData, "@=""(.*)""", "RegWrite REG_SZ, PathMarker, , $1")
; marker "=" > REG_SZ
InData := RegExReplace(InData, """(.*)""=""(.*)""", "RegWrite REG_SZ, PathMarker, $1, $2")
; marker @=dword: > REG_DWORD (значение по-умолчанию)
InData := RegExReplace(InData, "@=dword:(\d+)", "RegWrite REG_DWORD, PathMarker, , $1")
; marker =dword: > REG_DWORD
InData := RegExReplace(InData, """(.*)""=dword:(\d+)", "RegWrite REG_DWORD, PathMarker, $1, $2")
; удаляемые разделы marker [-HKEY_
InData := RegExReplace(InData, "i)\[-(HKEY_\w+)\\(.*)\]", "RegDelete $1, $2")
; удаляемые параметры (по-умолчанию) marker @=-
InData := RegExReplace(InData, "@=-.*", "RegDelete PathMarker, AHK_DEFAULT")
; удаляемые параметры marker "=-
InData := RegExReplace(InData, """(.*)""=-.*", "RegDelete PathMarker, $1")
; заменить \\ на \
InData := StrReplace(InData, "\\", "\")
; заменить \" на "
InData := StrReplace(InData, "\""", """")
; заменить "" на "
InData := StrReplace(InData, """""", """")
Loop parse, InData, `n, `r
{
; marker =hex: > REG_BINARY
If InStr(A_LoopField, "=hex:") {
NoPathOut .= RegExReplace(A_LoopField, "@=hex:.*|""(.*)""=hex:.*", "RegWrite REG_BINARY, PathMarker, $1, "
. StrReplace(RegExReplace(A_LoopField, "(.*):"), ",") "`n") ; + удалить запятые из binary data
}
; marker =hex(2): > REG_EXPAND_SZ
Else if InStr(A_LoopField, "=hex(2)") {
Hex := RegExReplace(A_LoopField, "(.*):")
NoPathOut .= RegExReplace(A_LoopField, "@=hex\(2\):.*|""(.*)""=hex\(2\):.*"
, "RegWrite REG_EXPAND_SZ, PathMarker, $1, " TxtFrom(Hex) "`n") ; + конвертировать hex data в Str
}
; marker =hex(7): > REG_MULTI_SZ
Else if InStr(A_LoopField, "=hex(7)") {
Hex := RegExReplace(A_LoopField, "(.*):")
NoPathOut .= RegExReplace(A_LoopField, "@=hex\(7\):.*|""(.*)""=hex\(7\):.*"
, "RegWrite REG_MULTI_SZ, PathMarker, $1, " TxtFrom(Hex) "`n") ; + конвертировать hex data в Str
}
Else {
NoPathOut .= A_LoopField "`n"
}
}
; escape characters:
NoPathOut := StrReplace(NoPathOut, "%", "``%") ; добавить зубочистки к %
; final
Loop parse, NoPathOut, `n, `r
{
Loop {
If InStr(A_LoopField, "[HKEY_") {
OutPath := RegPath() ; преобразовать path реестра в формат AHK
Break
}
OutData := StrReplace(A_LoopField, "PathMarker", OutPath) ; заменить маркеры "PathMarker" на реальный AHK path
GoSub Print
Break
}
}
If (DllCall("GetVersion") & 0xFF = 10) { ; проверить версию OS
FileAppend
(
`t`t`t/*
`tПРЕДУПРЕЖДЕНИЕ!
Данная машина работает на Windows 10.
В этой OS некоторые параметры реестра не могут быть добавлены или удалены с помощью скрипта!
*/
), % RegFileDir "\" RegFileNoExt ".ahk", UTF-8
}
SplashTextOn 300, 100, % ProgName, % "`nКонвертирование файла`n""" RegFileName """`nзавершено!"
Sleep 2000
SplashTextOff
ExitApp
Print:
SplitPath RegFile, RegFileName, RegFileDir,, RegFileNoExt
FileAppend
(
% OutData "`n"
), % RegFileDir "\" RegFileNoExt ".ahk", UTF-8
Return
;______________________________________________________________________________________________
; Functions
RegPath() {
RegPath := StrReplace(A_LoopField, "`,", "``,") ; добавить зубочистки к запятым
RegPath := RegExReplace(RegPath, "i)\[HKEY_CLASSES_ROOT\\(.*)\]", "HKCR, $1")
RegPath := RegExReplace(RegPath, "i)\[HKEY_CURRENT_USER\\(.*)\]", "HKCU, $1")
RegPath := RegExReplace(RegPath, "i)\[HKEY_LOCAL_MACHINE\\(.*)\]", "HKLM, $1")
RegPath := RegExReplace(RegPath, "i)\[HKEY_USERS\\(.*)\]", "HKU, $1")
Return RegPath
}
TxtFrom(Hex) {
If InStr(Hex, ",00,00,00,") { ; предыдущие ,00, + символ перевода новой строки 00,00 (встречается в REG_MULTI_SZ)
Hex := StrReplace(Hex, ",00,00,00,00") ; чтобы далее не изменялся на `n , удалить из hex data заключительные четыре блока нулей
Hex := StrReplace(Hex, ",00,00,00,", ",00,60,00,6e,00,") ; предыдущие ,00, + символ перевода новой строки (только между строк, на что указывает финальная запятая после последних 00,) заменить на ,00,`n
}
Hex := StrReplace(Hex, ",") ; удалить запятые из hex строки
Loop % StrLen(Hex) /2 {
Str .= Chr("0x" SubStr(Hex, A_index *4 -1, 2) SubStr(Hex, A_index *4 -3, 2))
}
Return Str
}
Файл реестра, где включены все встречавшиеся мне типы (использовался для тестирования скрипта):
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\TEST\AVerMedia TECHNOLOGIES, Inc.]
"DefaultAP"="AVerTV_GE"
[HKEY_CURRENT_USER\Software\TEST\AVerMedia TECHNOLOGIES, Inc.\AVerTV_GE\Remote]
"Defpath"="%ProgramFiles%\\test.exe"
[HKEY_CURRENT_USER\Software\TEST\AVerMedia TECHNOLOGIES, Inc.\Common\Service]
"HIDRec"="C:\\IR Remote\\AVerRemote\\AVerHIDReceiver.exe"
"ServicePath"="C:\\IR Remote\\AVerRemote\\"
[HKEY_CURRENT_USER\Software\TEST-1]
@=""
@="бубль гум"
@=dword:00477579
"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"
[HKEY_CURRENT_USER\Software\TEST-1\command]
@="\"C:\\Program Files\\Notepad++\\notepad++.exe\" \"%1\""
"test-1"="\"C:\\Program Files\\Notepad++\\notepad++.exe\" \"%V\""
"test-2"="C:\\Program Files\\Registry Workshop\\RegWorkshop.exe %V"
; преобразовать hex
[HKEY_CURRENT_USER\Software\TEST-2]
@=hex:47,75,79,20,46,61,77,6b,65,73
@=hex(2):22,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,\
72,00,61,00,6d,00,20,00,46,00,69,00,6c,00,65,00,73,00,5c,00,41,00,75,00,74,\
00,6f,00,48,00,6f,00,74,00,6b,00,65,00,79,00,5c,00,41,00,75,00,74,00,6f,00,\
48,00,6f,00,74,00,6b,00,65,00,79,00,2e,00,65,00,78,00,65,00,22,00,00,00
@=hex(7):31,00,2d,00,45,00,6e,00,67,00,6c,00,69,00,73,00,68,00,20,00,32,00,2d,\
00,20,04,43,04,41,04,41,04,3a,04,38,04,39,04,00,00,00,00
"this_is_REG_DWORD"=dword:00477579
"this_is_REG_BINARY-1"=hex:47,75,79,20,46,61,77,6b,65,73
"this_is_REG_MULTI_SZ"=hex(7):33,00,38,00,20,00,50,00,61,00,72,00,72,00,6f,00,\
74,00,73,00,00,00,42,00,75,00,62,00,6c,00,65,00,00,00,47,00,75,00,6d,00,00,\
00,00,00
"this_is_REG_EXPAND_SZ-1"=hex(2):22,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,\
72,00,61,00,6d,00,20,00,46,00,69,00,6c,00,65,00,73,00,5c,00,41,00,75,00,74,\
00,6f,00,48,00,6f,00,74,00,6b,00,65,00,79,00,5c,00,41,00,75,00,74,00,6f,00,\
48,00,6f,00,74,00,6b,00,65,00,79,00,2e,00,65,00,78,00,65,00,22,00,00,00
"this_is_REG_EXPAND_SZ-2"=hex(2):43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,\
00,61,00,6d,00,20,00,46,00,69,00,6c,00,65,00,73,00,5c,00,70,00,61,00,69,00,\
6e,00,74,00,2e,00,6e,00,65,00,74,00,5c,00,50,00,61,00,69,00,6e,00,74,00,44,\
00,6f,00,74,00,4e,00,65,00,74,00,2e,00,65,00,78,00,65,00,00,00
"this_is_REG_BINARY-2"=hex:50,69,67,6C,65,74,20,22,46,75,6E,74,69,6B,22
; удаление параметров
[HKEY_CURRENT_USER\Software\TEST-1-Delete]
@=-"бубль гум"
"this_is_REG_DWORD-Del"=-dword:00477579
"this_is_REG_SZ-Del"=-"\"C:\\Program Files\\Notepad++\\notepad++.exe\""
"this_is_REG_BINARY-Del"=-hex:47,75,79,20,46,61,77,6b,65,73
; удаление разделов
[-HKEY_CURRENT_USER\Software\TEST-2-Delete]
[-HKEY_CLASSES_ROOT\Software\TEST-3-Delete\xxxxxxxxx]