1 (изменено: freeZer0K, 2017-11-14 05:53:59)

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

Для тех, кому приходится часто переделывать *.reg файлы для AHK скриптов, предлагаю тестирование RegFile2Ahk Converter - конвертер файлов реестра в  формат AHK.
Ничего подобного для AHK найти не получилось, пришлось писать.
Весь скрипт прокомментирован, старался писать "читабельным кодом".
Приветствуется только конструктивная критика и конкретные предложения и решения по улучшению!

Использование:
1. Запустить скрипт и выбрать нужный файл рееста.  На выхлопе в исходной директории получаем файл с тем-же именем *.ahk
или
2. В проводнике, в контекстном меню грызуна на *.reg файлах будет пункт "RegFile2Ahk Converter".

Оригинал reg-файла в любом варианте НЕ удаляется.

Замечание:
Чтобы скрипт работал из контекстного меню мыши, нужно скомпилить его в exe и один раз запустить от имени админа.
СКРИПТ БЕЗ КОМПИЛЯЦИИ ИЗ КОНТЕКСТНОГО МЕНЮ МЫШИ РАБОТАТЬ НЕ БУДЕТ!

Если использование контекстного меню мыши для конвертирования не планируется, удалите часть кода между:

;_____________________________ begin context menu ______________________________

;______________________________ end context menu ______________________________

Особенности:
* старался не оставлять мусор типа @="" и подобное.
* понимает только самые распостраненные типы параметров и не видит экзотики типа REG_LINK, REG_QWORD и подобные.
* в REG_MULTI_SZ (многострочный) заменяет знак перехода на новую строку в hex-формате на "`n" для AHK-формата.
* в REG_EXPAND_SZ и REG_MULTI_SZ при переводе из hex, если текст состоит из кириллицы - крякозябры.

/*
RegFile2Ahk Converter 1.00
Registry file to *.ahk converter
Copyright © 2016 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
	}
;_____________________________ begin 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 MakeAll
		}
;______________________________ end context menu ______________________________

GetRegFile:
Title := "Выбор файла реестра для конвертирования"
FileSelectFile RegFile, 3,, % Title, Файлы реестра (*.reg)
If !RegFile
	{
	MsgBox 0x34, % ProgName, Файл реестра не выбран!`n`nПовторить?
	IfMsgBox Yes
		{
		GoTo GetRegFile
		}
	IfMsgBox No
		{
		ExitApp
		}
	}
	
MakeAll:
FileRead InData, % RegFile

; удаление строки Windows Registry Editor Version 5.00
InData := RegExReplace(InData, "i)Windows Registry Editor Version.*(\R+|$)")
; удаление пустых значений (по-умолчанию)
InData := StrReplace(InData, "@=""""", "")
; удаление пустых строк и двойных и более пробелов в hex data
InData := RegexReplace(InData, "`am)^\s{2,}")
; "выпрямление" hex data с удалением backslash
InData := RegexReplace(InData, "\\\R")
; 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, "(.*=-.*)", ";$1`t- удаление параметров невозможно в Windows 10")
; замена \\ на \ in path
InData := StrReplace(InData, "\\", "\")
; замена \" на " in path
InData := StrReplace(InData, "\""", """")
; замена "" на " in path
InData := StrReplace(InData, """""", """")

Loop parse, InData, `n, `r
	{
	; marker	=hex: > REG_BINARY	+ удаление запятых из binary data
	If InStr(A_LoopField, "=hex:")
		{
		NoPathOut .= RegExReplace(A_LoopField, "@=hex:.*|""(.*)""=hex:.*", "RegWrite REG_BINARY, PathMarker, $1, "
		. StrReplace(RegExReplace(A_LoopField, "(.*):"), ",", "") "`n")
		}
	; marker	=hex(2): > REG_EXPAND_SZ	+ конвертирование hex data в ASCII
	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")
		}
	; marker	=hex(7): > REG_MULTI_SZ		+ конвертирование hex data в ASCII
	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")
		}
		Else
			{
			NoPathOut .= A_LoopField "`n"
			}
	}
	
; escape characters:
; добавление зубочистки к %
NoPathOut := StrReplace(NoPathOut, "%", "``%")

; final
Loop parse, NoPathOut, `n, `r
	{
	Loop
		{
		If A_LoopField contains [HKEY_
			{
			OutPath := RegPath(RegPathAhk) ; преобразование path реестра в формат AHK
			Break
			}
		OutData := StrReplace(A_LoopField, "PathMarker", OutPath) ; замена маркеров "PathMarker" на реальный AHK path
		GoSub Print
		Break
		}
	}
	
SplashTextOn 300, 100, % ProgName, % "`nКонвертирование файла`n""" RegFileName """`nзавершено!"
Sleep 3000
SplashTextOff

ExitApp

Print:
SplitPath RegFile, RegFileName, RegFileDir,, RegFileNoExt
FileAppend
	(
	% OutData "`n"
	), % RegFileDir "\" 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
}

TxtFrom(Hex) {
If InStr(Hex, ",00,00,00,") ; символ перевода новой строки (00,00 - встречается в REG_MULTI_SZ)
	{
	Hex := StrReplace(RegExReplace(Hex, "^(.*),00,00,00,00", "$1") ; удаление из hex data последних четырех болоков нулей
	, ",00,00,00,", ",7c,00,7c,00,7c,00,") ; + замена перевода новой строки на маркер-разделитель "|||"
	Loop parse, Hex, `,
		{
		ASCII .= Chr("0x" A_LoopField)
		}
	ASCII := StrReplace(ASCII, "|||", "``n") ; замена маркера-разделителя "|||" на символ "`n"
	}
	Else
		{
		Loop parse, Hex, `,
			{
			ASCII .= Chr("0x" A_LoopField)
			}
		}
Return ASCII
}

Тестовый файл реестра, где включены все встречавшиеся мне типы:

Windows Registry Editor Version 5.00

[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]

На этом тестил во время написания.
Тестируем на разных reg-файлах и пишем об ошибках.

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-11-14 03:46:15)

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

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

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

Вы тестили этот скрипт на других reg-файлах, кроме тестового варианта? Есть еще какие-либо ошибки?