Что нового

Как записать значение ключей реестра в переменную

assch

Новичок
Сообщения
166
Репутация
4
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xfd]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xfdf]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AcroExch.Document]

Есть список ключей реестра (для примера я показал три ключа на самом деле их может быть больше например 300)
Нужно из реестра скопировать все значения этих ключей и записать в один файл соответственно такого вида

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xfd]
"Content Type"="application/vnd.adobe.xfd+xml"
@="AcroExch.XFDDoc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xfdf]
"Content Type"="application/vnd.adobe.xfdf"
@="AcroExch.XFDFDoc"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AcroExch.Document]
@="Adobe Acrobat Document"
"BrowseInPlace"="1"
"EditFlags"=dword:00010000

Функции которые я нашёл работают относительно долго потому что (хотя могу ошибатся) при каждой
записи ключа и значения работают с файлом чтобы записать туда очередное значение
Я думаю быстрее будет если делать это в цикле а значения записывать в переменную
Ну а потом из переменной уже записать в файл
Например список ключей лежит в файле 1.txt
Ставим строчки этого файла в цикл и........
Не подскажете?

Цикл примерно такой:

Код:
Global $text  ; Переменная куда будет заносится массив
$sPatch = "1.txt"   ; Файл где записан список ключей реестра
$iCount =_FileCountLines($sPatch)
For $i=1 To $iCount

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

$text &= "" & @CRLF  ;Пробел после записи очередного ключа и значения
$text &= $Array & @CRLF   ; $Array - значение очередного ключа
Next

$File = FileOpen('1.reg', 2) 
FileWrite($File, "Windows Registry Editor Version 5.00" & @CRLF)
FileWrite($File, $text)
FileClose($File)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Re: Как записать значение ключей реестра в переменную и в цыкле

Код:
Dim $aKeys[3] = ['HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xfd', 'HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xfdf', 'HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AcroExch.Document']

$sData = 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF
For $i = 0 To 2
	$sText = _RegExport($aKeys[$i])
	If $sText Then
		$sData &= $sText & @CRLF
	EndIf
Next
FileWrite('data.reg', $sData)

Func _RegExport($sKey, $sFile = '')

	Local $PID, $Root, $Data = 0, $Text = StringSplit($sKey, '\', 2)

	If IsArray($Text) Then
		$Text = $Text[0]
	Else
		$Text = $sKey
	EndIf
	Switch $Text
		Case 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_CURRENT_CONFIG'
			$Root = $Text
		Case 'HKCR'
			$Root = 'HKEY_CLASSES_ROOT'
		Case 'HKCU'
			$Root = 'HKEY_CURRENT_USER'
		Case 'HKLM'
			$Root = 'HKEY_LOCAL_MACHINE'
		Case 'HKU'
			$Root = 'HKEY_USERS'
		Case 'HKCC'
			$Root = 'HKEY_CURRENT_CONFIG'
		Case Else
			Return 0
	EndSwitch
	$sFile = StringStripWS($sFile, 3)
	If Not $sFile Then
		Do
			For $i = 1 To 4
				$sFile &= Chr(Random(97, 122, 1))
			Next
			$sFile = StringRegExpReplace(@TempDir & '\~reg' & $sFile & '.tmp', '\\+', '\\')
		Until Not FileExists($sFile)
		$Data = 1
	Else
		If (FileExists($sFile)) And (Not FileDelete($sFile)) Then
			Return 0
		EndIf
	EndIf
	$PID = Run('regedit.exe ' & '/e /s "' & $sFile & '" "' & StringReplace($sKey, $Text, $Root, 1) & '"')
	If @error Then
		Return 0
	EndIf
	ProcessWaitClose($PID)
	If Not $Data Then
		$Data = FileExists($sFile)
	Else
		$Data = StringRegExpReplace(FileRead($sFile), '\A[^[]*|' & '[' & @LF & ',' & @CR & ']*\Z', '')
		FileDelete($sFile)
		If Not $Data Then
			$Data = 0
		EndIf
	EndIf
	Return $Data
EndFunc   ;==>_RegExport
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Re: Как записать значение ключей реестра в переменную и в цыкле

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Re: Как записать значение ключей реестра в переменную и в цыкле

А куда торопиться? Ты же ведь ее вызываешь один раз, а не постоянно в цикле.


Добавлено:
Сообщение автоматически объединено:

Есть еще _RegEnumValues(), но у нее немного другой формат представления данных.
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Re: Как записать значение ключей реестра в переменную и в цыкле

Просто когда например 300 ключей это действие затягивается.
Пробывал поработать с функциями для реестра но так и не чего пока не добился.
Интересно как всё таки можно это обойти чтобы не создавались лишние файлы,
ну и соответственно не убивалось бы лишнее время.

Есть еще _RegEnumValues(), но у нее немного другой формат представления данных.

Мне желательно бы формат Рег файла
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 575
Репутация
335
Re: Как записать значение ключей реестра в переменную и в цыкле

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки кода необходимо заключать в соответствующий тег ([code]), а также большие выдержки текста помещайте под тег [spoiler], там где это поддерживается естественно. Так же если у Вас код Aiutoit, то нужно его заключать в тег [autoit]. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, Администратор форума.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
assch, вот здесь я выложил интересующую тебя функцию.
 
Верх