Für ein Projekt benötigte ich einige Registry-Funktionen.
_Reg2Array()
_Array2Reg()
_RegRecursiveCount()
_RegExists()
_RegCopy()
Verbesserungen (gerade die Geschwindigkeit bei einer großen Anzahl von Schlüsseln lässt noch zu wünschen) sind natürlich immer willkommen....
Edit: _Reg2Array() V1.1 - Switch Idee von AspirinJunkie übernommen
Spoiler anzeigen
#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]; Registrypfad kopieren
; If _RegCopy("HKCU\Printers", "HKCU\PrinterTemp") Then
; Msgbox(0,"Erfolg", "Kopieren des Registrypfades war erfolgreich !")
; Else
; Msgbox(48,"Fehler", "Kopieren des Registrypfades war fehlerhaft !")
; EndIf
; Schlüssel und Werte zählen
; $Reg = "HKCU\Printers"
; Msgbox(0,"","Die Registry enthält unter '" & $Reg & "' " & _RegRecursiveGetCount($Reg) & " Schlüssel und Werte !")
; Schlüssel und Werte rekursiv in ein Array lesen und anzeigen
;$aResult = _Reg2Array("HKCU\Printers")
;_ArrayDisplay($aResult)
; Schlüssel und Werte rekursiv in einen neuen Schlüssel schreiben und
; eine Rückmeldung ausgeben
; If _Array2Reg($aResult, "HKCU\Temp") Then
; Msgbox(0,"Erfolg", "Einfügen des Array's in die Registry war erfolgreich !")
; Else
; Msgbox(48,"Fehler", "Fehler beim Einfügen in die Registry !")
; EndIf
;===============================================================================
; Name _Reg2Array($sRegKey, $RegSubKey)
; Version V1.1
; Description Create an Array of all registry keys and sub-keys
; Parameter(s) $sRegKey - Startkey to enumerate including any sub-keys
; $sRegSubKey - SubKey for recursive recall
; Return Value(s) On Success - Returns an array with Startkeyname, Subkeyname,
; Valuename, Valuetype and Value
; On Failure -
; Author(s) [email='Micha_he@autoit.de'][/email]
; Help/ThanksTo [email='KaFu@autoitscript.com'][/email]
; [email='AspirinJunkie@autoit.de'][/email]
; Last modified 2010-07-13
;===============================================================================
Func _Reg2Array($sRegKey, $sRegSubKey = "")
Local Const $aTypes[12] = ["REG_NONE", "REG_SZ", "REG_EXPAND_SZ", "REG_BINARY", "REG_DWORD", "REG_DWORD_BIG_ENDIAN", "REG_LINK", "REG_MULTI_SZ", "REG_RESOURCE_LIST", "REG_FULL_RESOURCE_DESCRIPTOR", "REG_RESOURCE_REQUIREMENTS_LIST", "REG_QWORD"]
Local $aResult[2][5], $aResult_Sub, $i, $y, $x, $iLast
Local $sRegKey_Name, $sRegKey_Value, $iValCount
If StringRight($sRegKey,1) = "\" Then StringTrimRight($sRegKey, 1)
If StringRight($sRegSubKey,1) = "\" Then StringTrimRight($sRegSubKey, 1)
$aResult[0][0] = 0
$aResult[1][0] = $sRegKey
$aResult[1][1] = $sRegSubKey
$iLast = UBound($aResult) - 1
$iValCount = 1
While 1
RegEnumVal($sRegKey & "\" & $sRegSubKey, $iValCount)
If @Error Then Exitloop
$iValCount += 1
Wend
$iValCount -= 1
ReDim $aResult[$iLast + $iValCount + 1][5]
$i = 1
While 1
$sRegKey_Name = RegEnumVal($sRegKey & "\" & $sRegSubKey, $i)
If @error Then ExitLoop
$iLast += 1
$aResult[$iLast][0] = $sRegKey
$aResult[$iLast][1] = $sRegSubKey
$aResult[$iLast][2] = $sRegKey_Name
$sRegKey_Value = RegRead($sRegKey & "\" & $sRegSubKey, $sRegKey_Name)
$aResult[$iLast][3] = $aTypes[@extended]
If IsInt($sRegKey_Value) Then
$aResult[$iLast][4] = Int($sRegKey_Value)
Else
$aResult[$iLast][4] = $sRegKey_Value
EndIf
$i += 1
Wend
$i = 1
While 1
$sRegKey_Name = RegEnumKey($sRegKey & "\" & $sRegSubKey, $i)
If @error Then ExitLoop
$aResult_Sub = _Reg2Array($sRegKey, $sRegSubKey & "\" & $sRegKey_Name)
if UBound($aResult_Sub) > 1 Then
ReDim $aResult[UBound($aResult) + UBound($aResult_Sub) - 1][5]
For $y = 1 To UBound($aResult_Sub) - 1
For $x = 0 To 4
$aResult[$iLast + $y][$x] = $aResult_Sub[$y][$x]
Next
Next
$iLast = UBound($aResult) - 1
EndIf
$i += 1
Wend
$aResult[0][0] = $iLast
Return $aResult
EndFunc
;===============================================================================
; Name _Array2Reg($aData, $sRegKey)
; Version V1.0
; Description Import a array from function '_Reg2Array()' in the registry
; Format see function '_Reg2Array()'
; Parameter(s) $aData - Array with Startkeyname, Subkeyname,
; Valuename, Valuetype and Value
; $sRegKey - Registrykey to import. (optional)
; If is empty, the function use the originalkey
; Return Value(s) On Success - 1 (@error = 0)
; On Failure - 0
; - @error 1 = No Array Inputdata
; - @error 2 = Not enough Array-Elements
; - @error 3 = Error at RegWrite-Command
; Author(s) [email='Micha_he@autoit.de'][/email]
; Help/ThanksTo
; Last modified 2010-07-13
;===============================================================================
Func _Array2Reg($aData, $sRegKey = "")
Local $i, $iRet
If Not IsArray($aData) Then Return SetError(1,0,0)
If Ubound($aData) <= 1 Then Return SetError(2,0,0)
If $sRegKey <> "" And StringRight($sRegKey, 1) = "\" Then StringTrimRight($sRegKey ,1)
For $i = 1 To $aData[0][0]
If $sRegKey = "" Then $sRegKey = $aData[$i][0]
If $aData[$i][1] = "" And $aData[$i][2] = "" And $aData[$i][3] = "" And $aData[$i][4] = "" Then
$iRet = RegWrite($sRegKey) ; ggf. noch prüfen und wenn vorhanden nicht neu schreiben
Else
If $aData[$i][2] = "" And $aData[$i][3] = "" And $aData[$i][4] = "" Then
$iRet = RegWrite($sRegKey & "\" & $aData[$i][1])
Else
$iRet = RegWrite($sRegKey & "\" & $aData[$i][1], $aData[$i][2], $aData[$i][3], $aData[$i][4])
EndIf
EndIf
If $iRet <> 1 Then Return SetError(3,0,0)
Next
Return SetError(0,0,1)
EndFunc
;===============================================================================
; Name _RegRecursiveGetCount($sRegKey)
; Version V1.0
; Description Count Keys and values recursiv in the Registry
; Parameter(s) $sRegKey - Registrykey to start
; Return Value(s) On Success - Count
; On Failure - 0
; - @error 1 = key not found
; Author(s) [email='Micha_he@autoit.de'][/email]
; Help/ThanksTo
; Last modified 2010-07-13
;===============================================================================
Func _RegRecursiveGetCount($sRegKey)
Local $iCount = 1
Local $i = 1
If Not _RegExists($sRegKey) Then Return SetError(1,0,0)
While 1
RegEnumVal($sRegKey, $i)
If @error Then ExitLoop
$i += 1
Wend
$iCount += ($i - 1)
$i = 1
While 1
$sSubKey = RegEnumKey($sRegKey, $i)
If @error Then ExitLoop
$i += 1
$iSubCount = _RegRecursiveGetCount($sRegKey & "\" & $sSubKey)
$iCount += $iSubCount
Wend
Return $iCount
EndFunc
;===============================================================================
; Name _RegExists($sRegKey, $sValue)
; Version V1.0
; Description Check if Registrykey or -value exists
; Parameter(s) $sRegKey - Registrykey to check
; $sValue - Value to check (optional)
; Return Value(s) On Success - 1
; On Failure - 0
; Author(s) [email='Micha_he@autoit.de'][/email]
; Help/ThanksTo
; Last modified 2010-07-11
;===============================================================================
Func _RegExists($sRegKey, $sValue = "")
RegRead ($sRegKey, $sValue)
If @error = -1 And $sValue = "" Then Return SetError(0,0,1)
If @error = 0 And $sValue <> "" Then Return SetError(0,0,1)
Return SetError(1,0,0)
EndFunc
;===============================================================================
; Name _RegCopy($sSource, $sDest)
; Version V1.0
; Description Copy a Registrytree
; Parameter(s) $sSource - Source copy from
; $sDest - Destination copy to
; Return Value(s) On Success - 1
; On Failure - 0
; - @error 1 = Sourcekey not found
; - @error 2 = No Sourcedata
; - @error 3 = Copy to destination failed
; Author(s) [email='Micha_he@autoit.de'][/email]
; Help/ThanksTo
; Last modified 2010-07-13
;===============================================================================
Func _RegCopy($sSource, $sDest)
Local $aResult
If Not _RegExists($sRegKey) Then Return SetError(1,0,0)
$aResult = _Reg2Array($sSource)
If IsArray($aResult) Then
$iRet = _Array2Reg($aResult, $sDest)
If $iRet = 1 Then
Return SetError(0,0,1)
Else
Return SetError(3,0,0)
EndIf
Else
Return SetError(2,0,0)
EndIf
EndFunc