1 (изменено: Alectric, 2016-09-30 13:41:52)

Тема: AHK: Конвертирование reg файлов в ahk

Скрипт для конвертирования файлов реестра (*.reg) в формат ahk.

#NoTrayIcon
#NoEnv
#SingleInstance,Force
SetBatchLines,-1
Process,Priority,,low
SetFormat,float,6.2

param1=%1%
if param1=
{
  FileSelectFile,FileToConvert,1,,Выберите файл для конвертирования,Рег файлы (*.reg)
  if errorlevel
    exitapp
}
else
  FileToConvert=%Param1%

FileRead,out,%FileToConvert%
loop,parse,out,`n
  step:=a_index/100
if step=0
  step=1

Gui,-SysMenu
Gui,Add,Progress,xm ym w400 h20 cBlue vSProgress
Gui,Add,text,xm y+5 w400 h40 vtxt
Gui,Add,Button,xm y+5 w400 h20,Отмена
Gui,Show,,Конвертирование %FileToConvert%

skip=0

WinGet,ID,ID,A
fileappend,;RegToAhk`n,%FileToConvert%.ahk
Loop,Read,%FileToConvert%,%FileToConvert%.ahk
{
  row:=A_Index
  GuiControl,,txt,Обработка строки №: %row%
  GuiControl,,SProgress,%SProgres%
  WinSetTitle,ahk_id %ID%,,%SProgres%`% Конвертирование %FileToConvert%
  SProgres:=% A_Index/step

  line:=A_LoopReadLine

if bin=
{
  if (line="" or line="Windows Registry Editor Version 5.00" or line="REGEDIT4")
  {
    if razdelchek=1
    {
      fileappend,%deystvie%`,REG_SZ`,%razdel%`,%vetv%`n
      razdelchek=0
    }
    deystvie=
    typ=
    razdel=
    vetv=
    parametr=
    znachenie=
    continue
  }

  if line contains [H,=
    deystvie=RegWrite
  if line contains =-,[-H
    deystvie=RegDelete

  if line contains [H,[-H
  {
    if razdelchek=1
      fileappend,%deystvie%`,REG_SZ`,%razdel%`,%vetv%`n
    if line contains HKEY_CURRENT_USER
      razdel=HKEY_CURRENT_USER
    if line contains HKEY_LOCAL_MACHINE
      razdel=HKEY_LOCAL_MACHINE
    if line contains HKEY_CLASSES_ROOT
      razdel=HKEY_CLASSES_ROOT
    if line contains HKEY_USERS
      razdel=HKEY_USERS
    if line contains HKEY_CURRENT_CONFIG
      razdel=HKEY_CURRENT_CONFIG
    vetv:=RegExReplace(line, "\[-?" razdel "\\(.*)\]" , "$1")

    razdelchek=1
    continue
  }
  razdelchek=0

  parametr:=RegExReplace(line, """(.*)""=.*" , "$1")
;  StringReplace,parametr,parametr,`,,```,,All
;  StringReplace,parametr,parametr,`%,```%,All
  if line contains `@=
    parametr=`@

  if line contains =
    typ=REG_SZ
  if line contains =dword:
    typ=REG_DWORD
  if line contains =hex(b):
    typ=REG_QWORD
  if line contains =hex:
    typ=REG_BINARY
  if line contains =hex(0):,=hex(2):,=hex(8):,=hex(9):
    typ=REG_EXPAND_SZ
  if line contains =hex(7):
    typ=REG_MULTI_SZ
}

  if line contains `@=
    znachenie:=RegExReplace(line, "`@=(.*)" , "$1")
  else
    znachenie:=RegExReplace(line, """" parametr """=(.*)" , "$1")

  if typ=REG_SZ
    znachenie:=RegExReplace(znachenie, """(.*)""" , "$1")
  if typ=REG_DWORD
    StringReplace,znachenie,znachenie,dword:,0x,1
  if typ=REG_QWORD
    StringReplace,znachenie,znachenie,`,,,All
  if typ=REG_BINARY
  {
    if znachenie contains \
    {
      bin=1
      temp.=znachenie
      continue
    }
    temp.=znachenie
    znachenie:=temp
    temp=
    bin=
    StringReplace,znachenie,znachenie,hex:,,1
    StringReplace,znachenie,znachenie,%a_space%,,All
    StringReplace,znachenie,znachenie,`n,,All
    StringReplace,znachenie,znachenie,\,,All
    StringReplace,znachenie,znachenie,`,,,All
  }
  if (typ="REG_EXPAND_SZ" or typ="REG_MULTI_SZ")
  {
    if znachenie contains \
    {
      bin=1
      temp.=znachenie
      continue
    }
    temp.=znachenie
    znachenie:=temp
    temp=
    bin=
    znachenie:=RegExReplace(znachenie, "hex\(\d\):(.*)" , "$1")
    StringReplace,znachenie,znachenie,%a_space%,,All
    StringReplace,znachenie,znachenie,`n,,All
    StringReplace,znachenie,znachenie,\,,All
    StringReplace,znachenie,znachenie,`,,,All
    znachenie:=Hex2Text(znachenie)
  }
;msgbox,%line%`n`np=%parametr%`n`nz=%znachenie%

  znachenie:=RegExReplace(znachenie, "``" , "````")
  StringReplace,znachenie,znachenie,`%,```%,All
  StringReplace,znachenie,znachenie,\\,\,All
  StringReplace,znachenie,znachenie,\`",`",All
  znachenie:=RegExReplace(znachenie, "\;" , "```;")
  if deystvie=RegDelete
  {
    if parametr=`@
      line=RegWrite,REG_SZ,%razdel%,%vetv%,,,
    else
      line=%deystvie%,%razdel%,%vetv%,%parametr%
  }
  else
  {
    if parametr=`@
      line=%deystvie%,%typ%,%razdel%,%vetv%,,%znachenie%
    else
      line=%deystvie%,%typ%,%razdel%,%vetv%,%parametr%,%znachenie%
  }
  FileAppend,%line%`n
}
GuiControl,,txt,Обработка строки №: %row%`n`nКонвертирование завершено.
sleep,3000
gui,destroy
exitapp


ButtonОтмена:
  ExitApp


Hex2Text(Hex)
{
  startpos:=1
  Loop % StrLen(Hex)/2
  {
    n .= Chr( "0x" . SubStr(Hex, StartPos+2 , 2) . SubStr(Hex, StartPos , 2) )
    startpos +=4
  }
  Return n
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

2

Re: AHK: Конвертирование reg файлов в ahk

deystvie=
    typ=
    razdel=
    vetv=
    parametr=
    znachenie=

Мрак!

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

3 (изменено: freeZer0K, 2016-09-30 01:40:34)

Re: AHK: Конвертирование reg файлов в ahk

Alectric, большущее спасибо!
Скрипт работает!

Я бы еще сократил названия разделов реестра.
В скрипте, который начал писать, предварительно я сделал так:

RegExReplace(RegPath, "i)\[HKEY_CLASSES_ROOT\\(.*)\]", "RegWrite ... HKCR, $1, ...")

ну и все остальные по такому типу.

В общем, еще раз БОЛЬШУЩЕЕ благодарю! Думаю, многим понадобится этот скрипт.

4

Re: AHK: Конвертирование reg файлов в ahk

Скрипт довольно таки старый, но рабочий, по этому переделывать лень, да и времени нет.

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

5

Re: AHK: Конвертирование reg файлов в ahk

Попробовал обработать файл следующего содержания:

REGEDIT4
[-HKEY_CURRENT_USER\Test]

Получил на выходе:

;RegToAhk
,,,,REGEDIT4,REGEDIT4

6

Re: AHK: Конвертирование reg файлов в ahk

Alectric пишет:

Обычно в экспортированных файлах реестра после первой строки должна быть одна пустая строка, насколько помню...

Но после последующей правки её может и не быть, так же как в экспортированном файле не может быть строки

[-HKEY_CURRENT_USER\Test]

но я строки такого вида обычно добавляю перед строками вида

[HKEY_CURRENT_USER\Test]

для очистки раздела от всех записей, кроме явно добавляемых этим файлом.

7 (изменено: Alectric, 2016-09-30 13:46:18)

Re: AHK: Конвертирование reg файлов в ahk

Подправил код в первом сообщении, попробуй.

OFF: Модераторы, простите. Слишком поздно удалил сообщение.

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

8 (изменено: Alectric, 2016-09-30 13:59:25)

Re: AHK: Конвертирование reg файлов в ahk

Ещё после "удаляющей" строки желательно ставить пустую строку.

[-HKEY_CURRENT_USER\Test]
[-HKEY_CURRENT_USER\Test2]
[HKEY_CURRENT_USER\Test]
"a"="1"

Так правильно:

[-HKEY_CURRENT_USER\Test]
[-HKEY_CURRENT_USER\Test2]

[HKEY_CURRENT_USER\Test]
"a"="1"

В общем конвертор ещё далек от идеала.

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

9

Re: AHK: Конвертирование reg файлов в ahk

Что вообще значит "конвертировать reg файл в ahk"?
Я правильно понимаю, что на выходе получается *.ahk скрипт с кучей RegWrite? Если да, то зачем это нужно?

10 (изменено: freeZer0K, 2016-10-01 00:12:40)

Re: AHK: Конвертирование reg файлов в ahk

Может все-таки пойти по такому пути? Я накропал пока чисто схематический вариант:

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

If !A_IsAdmin
	{
	Run % "*RunAs """ A_ScriptFullPath """"
	ExitApp
	}
	
ProgramName := "RegFile2Ahk"
SourceDir := "xxxxx"

/*
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 Primary, % RegFile
Primary := RegExReplace(Primary, "i)Windows Registry Editor Version.*?(\R+|$)") ; удаление Windows Registry Editor Version 5.00
Primary := RegExReplace(Primary, "@=""""(\R+|$)") ; удаление пустых значений (по-умолчанию)

; @="бубль гум" (обычно по-умолчанию REG_SZ, якорь замены @="")
Primary := RegExReplace(Primary, "@=""(.*)""", "RegWrite REG_SZ, RegPath,, $1")

; "this_is_REG_SZ"="C:\\Program Files\\Registry Workshop\\RegWorkshop.exe" (якорь замены   =" > REG_SZ)
Primary := RegExReplace(Primary, """(.*)""=""(.*)""", "RegWrite REG_SZ, RegPath, $1, $2")

; "this_is_REG_DWORD"=dword:00477579 (якорь замены   =dword: > REG_DWORD)
Primary := RegExReplace(Primary, """(.*)""=dword:(\d+)", "RegWrite REG_DWORD, RegPath, $1, $2")

; "this_is_REG_BINARY"=hex:34,37,37,35,\ (якорь замены   =hex: > REG_BINARY)
Primary := RegExReplace(Primary, """(.*)""=hex:(.*)\\", "RegWrite REG_BINARY, RegPath, $1, $2")

; "this_is_REG_MULTI_SZ"=hex(7):33,00,38,00,\ (якорь замены   =hex(7): > REG_MULTI_SZ)
Primary := RegExReplace(Primary, """(.*)""=hex\(7\):(.*)\\", "RegWrite REG_MULTI_SZ, RegPath, $1, $2")

; "this_is_REG_EXPAND_SZ"=hex(2):22,00,43,00,\ (якорь замены   =hex(2): > REG_EXPAND_SZ)
Primary := RegExReplace(Primary, """(.*)""=hex\(2\):(.*)\\", "RegWrite REG_EXPAND_SZ, RegPath, $1, $2")

; "this_is_REG_QWORD"=hex(b):34,37,37,35 (якорь замены   =hex(b): > REG_QWORD)
Primary := RegExReplace(Primary, """(.*)""=hex\(b\):(\d+)", "RegWrite REG_QWORD, RegPath, $1, $2")

Primary := StrReplace(Primary, "\\", "\", "All") ; замена double backslash на один
Primary := StrReplace(Primary, "\""", """", "All") ; удаление оставшихся backslash перед двойными кавычками в path \"  \"
GoTo Print



/*
Здесь преобразовать Path реестра [HKEY_CURRENT_USER\Software\TEST] в вид "HKCR, Software\TEST," затем удалить эти строки и заменить якоря "RegPath" на полученные измененные строки
*/
/*
; Secondary
Loop read, % RegFile
	{
	If A_LoopReadLine contains [HKEY_ ; если строка содержит "[HKEY_" (path реестра)
		{
		MsgBox % RegPath(Secondary)
		}
	}
	
RegPath(Secondary)
	{
	Secondary := RegExReplace(A_LoopReadLine, "i)\[HKEY_CLASSES_ROOT\\(.*)\]", "RegWrite HKCR, $1, *")
	Secondary := RegExReplace(Secondary, "i)\[HKEY_CURRENT_USER\\(.*)\]", "RegWrite HKCU, $1, *")
	Secondary := RegExReplace(Secondary, "i)\[HKEY_LOCAL_MACHINE\\(.*)\]", "RegWrite HKLM, $1, *")
	Return Secondary
	}

*/
/*
В заключении преобразовать HEX данные в краткие читабельные строки. Имеется ввиду REG_MULTI_SZ
*/

Print:
SplitPath RegFile,,,, RegFileNoExt
FileAppend
	(
	% Primary
	), % RegFileNoExt ".ahk", UTF-8
	
ExitApp

/*_________________________________________

Имена корневых разделов:

HKEY_CLASSES_ROOT = HKCR
HKEY_CURRENT_USER = HKCU
HKEY_LOCAL_MACHINE = HKLM
HKEY_USERS = HKU
HKEY_CURRENT_CONFIG = HKCC
___________________________________________

Типы параметров:

Наименование					Тип данных		Назначение

REG_SZ							Строковый		Текст
REG_DWORD						Числовой		Число
REG_BINARY						Двоичный		Двоичные данные
REG_EXPAND_SZ					Строковый		Текст и переменные
REG_MULTI_SZ					Многостроковый	Массив строк
REG_LINK						Строковый		Путь к файлу
REG_QWORD						Числовой		64-разрядное числовое значение
REG_NONE						Неизвестный		Зашифрованные данные
REG_RESOURCE_LIST				Строковый		Список ресурсов устройств
REG_FULL_RESOURCE_DESCRIPTOR	Строковый		Идентификатор ресурса устройства
REG_RESOURCE_REQUIREMENTS_LIST	Строковый		Идентификатор ресурса устройства
___________________________________________


Сделал тестовый вариант регфайла REGISTRY-TEST.reg с наиболее часто используемыми типами (для лучшей читабельности разделил строки пустыми):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\TEST]
@=""

"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"

"this_is_REG_BINARY"=hex:34,37,37,35,37,39,20,34,36,36,31,37,37,36,42,36,35,37,\
  33

"this_is_REG_DWORD"=dword:00477579

"this_is_REG_MULTI_SZ"=hex(7):33,00,38,00,20,00,3f,04,3e,04,3f,04,43,04,33,04,\
  30,04,35,04,32,04,00,00,31,04,43,04,31,04,3b,04,4c,04,00,00,33,04,43,04,3c,\
  04,00,00,00,00

"this_is_REG_EXPAND_SZ"=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_QWORD"=hex(b):34,37,37,35,37,39,20,34

[HKEY_CURRENT_USER\Software\TEST-2]
@="бубль гум"

Если скрипт допилить по такой схеме, то будет меньше кода и быстрее будет обработка, полагаю. Здесь главное создать  более унифицированные шаблоны RegExReplace() для первоначального прохождения "Primary".

Кстати, если заменить "\""\n (новая строка)" в многострочных параметрах типа:

"this_is_REG_EXPAND_SZ"=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,\

на конкатинацию ahk "." будет ли это дело работать? Вытягивать все это дело в одну строку тоже неудобно ....