1 (изменено: freeZer0K, 2017-12-21 20:18:20)

Тема: 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]

2

Re: AHK: RegFile2Ahk Converter - конвертер *.reg файлов в *.ahk

Просьба описать в теме: для чего предназначен скрипт и как им пользоваться.

3

Re: AHK: RegFile2Ahk Converter - конвертер *.reg файлов в *.ahk

freeZer0K
А зачем новую тему-то создали (не первый раз, кстати)? Добивали бы уже то, что есть.

4

Re: AHK: RegFile2Ahk Converter - конвертер *.reg файлов в *.ahk

Flasher, здесь тема немного другая - тестирование уже готового скрипта. Подумал, будете ругаться, если в старую писать.

5

Re: AHK: RegFile2Ahk Converter - конвертер *.reg файлов в *.ahk

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

6 (изменено: Alectric, 2017-11-13 18:54:19)

Re: AHK: RegFile2Ahk Converter - конвертер *.reg файлов в *.ahk

; удаление параметров
;@=-"бубль гум" - удаление параметров невозможно в Windows 10
;"this_is_REG_DWORD-Del"=-dword:00477579 - удаление параметров невозможно в Windows 10
;"this_is_REG_SZ-Del"=-"C:\Program Files\Notepad++\notepad++.exe" - удаление параметров невозможно в Windows 10
;"this_is_REG_BINARY-Del"=-hex:47,75,79,20,46,61,77,6b,65,73 - удаление параметров невозможно в Windows 10

А если у меня не Windows 10?

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

7 (изменено: freeZer0K, 2017-12-21 18:09:53)

Re: AHK: RegFile2Ahk Converter - конвертер *.reg файлов в *.ahk

Вопрос конечно интересный ...
Давно не занимался этим скриптом, думал эта тема никому не интересна.

Вообще можно решить этот вопрос определением типа OS и Win10 поставить как исключение.

8

Re: AHK: RegFile2Ahk Converter - конвертер *.reg файлов в *.ahk

Обновил весь код RegFile2Ahk Converter.

* Главное изменение - теперь hex данные, содержащие кириллические символы, конвертируются в текст без крякозябр.
* Учтены замечания Alectric.
* Исправлен найденный недочет - если в path рееста имеется запятая, конвертированный код был неверен.
С данной ситуацией столкнулся случайно. Это вариант добавил в тестовый файл реестра:
[HKEY_CURRENT_USER\Software\TEST\AVerMedia TECHNOLOGIES, Inc.\AVerTV_GE\Remote]

Сообщайте о найденных ошибках или недочетах!