Что нового

Экспорт реестра в файл

musicstashall

Знающий
Сообщения
322
Репутация
7
Всем доброго.
Хочу экспортировать в reg файл два раздела реестра. Собственно, как это сделать?? Есть функция _RegExport(), но она не может добавлять данные в файл, создает копию только одного раздела. Пробовал экспортировать в разные файлы, а потом объединить простыми функциями Open, Read, Write, но почему-то записывает не в конец файла, а перезаписывает его полностью. Помогайте, други)
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Вот устранил причину, почему не мог записать в конец файла, теперь записывает:

Код:
$FileName = 'Setting_' & @YEAR & '.' & @MON & '.' & @MDAY & '_' & @HOUR & '-' & @MIN & '.reg'
_RegExport(@MyDocumentsDir & '\Saves\' & $FileName, $DWM)
_RegExport(@MyDocumentsDir & '\Saves\temp.reg', $BWM)
Local $hOut = FileOpen(@MyDocumentsDir & '\Saves\' & $FileName, 1) ; основной файл, куда пишем
Local $hIn = FileOpen(@MyDocumentsDir & '\Saves\temp.reg') ; темп файл второго раздела
Local $data = FileRead($hOut)
FileWrite($hOut, $data)
$data = FileRead($hIn)
FileWrite($hOut, $data)
FileClose($hIn)
FileClose($hOut)
FileDelete(@MyDocumentsDir & '\' & $NameSoft & '\Saves\temp.reg')


Но это как-то все не хорошо. Во-первых, размер файла делается в два раза меньше, как-то подозрительно, потом записывается одна ненужная строка при добавлении данных второго раздела: Windows Registry Editor Version 5.00. Или ее удалить как-то, или записывать выборочно.... уже не знаю как.
 
A

Alofa

Гость
Код:
$FileName = 'Setting_' & @YEAR & '.' & @MON & '.' & @MDAY & '_' & @HOUR & '-' & @MIN & '.reg'
_RegExport(@MyDocumentsDir & '\Saves\' & $FileName, $DWM)
_RegExport(@MyDocumentsDir & '\Saves\temp.reg', $BWM)
Local $hOut = FileOpen(@MyDocumentsDir & '\Saves\' & $FileName, 1) ; основной файл, куда пишем
Local $data = FileRead(@MyDocumentsDir & '\Saves\temp.reg') ; темп файл второго раздела
FileWrite($hOut, $data)
FileClose($hOut)
FileDelete(@MyDocumentsDir & '\Saves\temp.reg')
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Посидел вчера и сделал так:

Код:
Func RegExport()
	DirCreate(@MyDocumentsDir & '\' & $MyName & '\Saves')
	$FileName = 'Setting_' & @YEAR & '.' & @MON & '.' & @MDAY & '_' & @HOUR & '-' & @MIN & '.reg'
	_RegExport(@MyDocumentsDir & '\' & $MyName & '\Saves\' & $FileName, $DWM)
	_RegExport(@MyDocumentsDir & '\' & $MyName & '\Saves\temp.reg', $BWM)
	If @error = 1 Then
		$err = 'раздел не существует'
	ElseIf	@error = 2 Then
	    $err = 'значение раздел не существует'
	ElseIf @error = 3 Then
		$err = 'невозможно создать reg-файл'
	ElseIf 	@error = 4 Then
		$err = 'ошибка чтения одного или нескольких значений'
	Else
		$err = 'Создана копия ' & $FileName
	EndIf
	Local $hOut = FileOpen(@MyDocumentsDir & '\' & $MyName & '\Saves\' & $FileName, 1) ; основной файл, куда пишем
	Local $hIn = FileOpen(@MyDocumentsDir & '\' & $MyName & '\Saves\temp.reg') ; темп файл второго раздела
	Local $data
	Local $i=2 ; начинаем читать со второй строки, пропуская первую
	While 1
		$data = FileReadLine($hIn, $i)
		If @error = -1 Then ExitLoop
		FileWriteLine($hOut, $data)
		$i = $i + 1
	Wend
	FileClose($hIn)
	FileClose($hOut)
	FileDelete(@MyDocumentsDir & '\' & $MyName & '\Saves\temp.reg')
	MsgBox('', $MyName, $err)
EndFunc
 
A

Alofa

Гость
OffTopic:
musicstashall сказал(а):
Самая главная ваша ошибка заключается в том, что если "_RegExport()" выдаст @error, то весь остальной код продолжит свою работу, а надо бы функцию остановить, т.е. выти из нее и желательно с ошибкой - читайте:
Код:
Return
SetError()

К стати, вместо конструкции "If...ElseIf...Else...EndIf", при обработке @error я бы посоветовал использовать "Switch...Case...EndSwitch".

Читать построчно и записывать построчно, ради того чтобы:
; начинаем читать со второй строки, пропуская первую
не есть рациональная идея. функция FileReadLine() при заданном втором параметре работают довольно медленно (Разделы реестра могут быль довольно большие).
А вообще:
Код:
StringStripWS() ; Чтобы избавиться от пустых символов в начале и конце строки, смотрите описание этой функции

$data = StringStripWS(StringRegExpReplace($data, '\R+', @CRLF), 3) ; А так можно удалить все пустые строки в текске
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
_RegExportToData
https://pastebin.com/9ndJDH5A

не в файл, а в переменную. Хоть 100 путей, без обращения к жёсткому диску

кстати автор _RegFunc.au3 предлагает открывать файл для записи, в режиме не обнуления, а дописывания, и просто скидывать туда (в файл) reg-данные
 
Верх