Ich habe Dein Script jetzt mal überarbeitet.
Auswahl ob Suchbegriff "Normal" (mit Platzhalter) oder als "RegExp" (muss ein gültiges RegExp-Pattern sein).
Außerdem eine Listview mit den Fundstellen und in der Statuszeile die momentane Position der Suche, sowie die Anzahl der Fundstellen.
Und ich habe das Script mal etwas verkleinert. Man muss nicht alles doppelt schreiben. Es reicht oft, an den richtigen Stellen eine Auswahl zu treffen.
Auswahl ob Suchbegriff "Normal" (mit Platzhalter) oder als "RegExp" (muss ein gültiges RegExp-Pattern sein).
Außerdem eine Listview mit den Fundstellen und in der Statuszeile die momentane Position der Suche, sowie die Anzahl der Fundstellen.
Und ich habe das Script mal etwas verkleinert. Man muss nicht alles doppelt schreiben. Es reicht oft, an den richtigen Stellen eine Auswahl zu treffen.
Show ContentRegSearch:
#include <AutoItConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <ListViewConstants.au3>
#include <Math.au3>
#include <Misc.au3>
#include <MsgBoxConstants.au3>
#include <StatusBarConstants.au3>
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
#NoTrayIcon
;~ #RequireAdmin
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Opt('MustDeclareVars', 1) ; Variablen müssen deklariert werden.
Opt('GUIOnEventMode', 1) ; Eventmode aktivieren.
Opt('GUICloseOnESC', 1) ; Wenn ESC gedrückt wird, Gui beenden.
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Global $idInput, $idNormal, $idRegExp, $idListview, $idStart, $nMsg, $sString, $hgui, $idHKLM, $idHKCU, $outfile
Global $sTitle = 'RegSearch'
Global $sVersion = '1.0.0.3'
Global $sAuthor = 'Bazii'
Global $sDate = '28.07.2017'
Global $sFound = '', $iFoundCount = 0
Global $hDLL = DllOpen("user32.dll")
Global $outfile = (@ScriptDir & '\RegSearch.exe')
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
If _Singleton($sTitle, 1) = 0 Then ; Wenn eine Instanz dieses Programms läuft, dann Meldung ausgeben ...
MsgBox(64, "Achtung", " -RegSearch- wurde bereits gestartet und kann nicht ein zweites Mal gestartet werden!", 10) ; Meldung ausgeben (Teil 1)
Exit ; Programm beenden
EndIf; Ende der If-Abfrage: Läuft bereits eine weitere Instanz?
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
$hgui = GUICreate($sTitle & ' ' & $sVersion, 640, 150, -1, -1)
GUISetIcon("..\..\ICON\logo_FTP.ico", -1)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUISetBkColor(0xD7E4F2)
GUISetOnEvent($GUI_EVENT_CLOSE, "__GUI_EVENT_CLOSE_")
$idInput = GUICtrlCreateInput("", 10, 10, 240, 21)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, 0, "Registry Suchwort-Eingabe") ; <- besser die Konstante benutzen
GUICtrlCreateLabel("Suchbegriff ist", 10, 45, 100, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUIStartGroup()
$idNormal = GUICtrlCreateRadio("Normal", 120, 45, 60, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUICtrlSetTip(-1, "Platzhalter erlaubt:" & @CRLF & "? = ein beliebiges Zeichen" & @CRLF & "* = (k)ein oder mehrere beliebige Zeichen", "Normal", 1, 1)
GUICtrlSetState(-1, $GUI_CHECKED)
$idRegExp = GUICtrlCreateRadio("RegExp", 190, 45, 60, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUICtrlSetTip(-1, "Es muss ein gültiges RegExp-Pattern in das Suchfeld eingegeben werden!", "RegExp", 1, 1)
$idListview = GUICtrlCreateListView('Gefundene Registry-Schlüssel', 260, 10, 370, 110)
_GUICtrlListView_SetColumnWidth($idListview, 0, 350)
GUICtrlCreateLabel("Durchsuchen von:", 10, 70, 100, 15)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUIStartGroup()
$idHKLM = GUICtrlCreateRadio('HKLM', 120, 70, 60, 15)
GUICtrlSetOnEvent(-1, '_id_Checkbox_HKLM')
GUICtrlSetTip(-1, "Computer\HKEY_LOCAL_MACHINE ", "HKLM = ", 1, 1)
GUICtrlSetFont(-1, 9, 500, "Arial")
GUICtrlSetState(-1, $GUI_CHECKED)
$idHKCU = GUICtrlCreateRadio('HKCU', 190, 70, 60, 15)
GUICtrlSetOnEvent(-1, '_id_Checkbox_HKCU')
GUICtrlSetTip(-1, "Computer\HKEY_CURRENT_USER ", "HKCU = ", 1, 1)
GUICtrlSetFont(-1, 9, 500, "Arial")
$idStart = GUICtrlCreateButton("Suche starten!", 10, 95, 240, 25)
GUICtrlSetState(-1, BitOR($GUI_FOCUS, $GUI_DEFBUTTON)) ; <- besser die Konstanten benutzen
GUICtrlSetOnEvent(-1, '_RegSearch_Start')
GUISetState(@SW_SHOW)
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Global $hStatus = _GUICtrlStatusBar_Create($hgui, -1, "", $SBARS_TOOLTIPS)
_GUICtrlStatusBar_SetMinHeight($hStatus, 20)
Global $iPart[3] = [1, 560, -1]
_GUICtrlStatusBar_SetParts($hStatus, $iPart)
_GUICtrlStatusBar_SetText($hStatus, " Registrypfad bitte auswählen", 1)
_GUICtrlStatusBar_SetText($hStatus, $iFoundCount, 2)
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
While Sleep(100)
WEnd
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _id_Checkbox_HKLM()
_GUICtrlStatusBar_SetText($hStatus, " HKLM ausgewählt", 1)
EndFunc ;==>_id_Checkbox_HKLM
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _id_Checkbox_HKCU()
_GUICtrlStatusBar_SetText($hStatus, " HKCU ausgewählt", 1)
EndFunc ;==>_id_Checkbox_HKCU
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _RegSearch_Start()
Local $sString = GUICtrlRead($idInput)
Local $bHKLM = BitAND(GUICtrlRead($idHKLM), $GUI_CHECKED) == $GUI_CHECKED ; True = HKLM, False = HKCU
Local $bRegExp = BitAND(GUICtrlRead($idRegExp), $GUI_CHECKED) == $GUI_CHECKED ; True = RegExp, False = Normal
Local $sFilename = StringRegExpReplace($sString, '\W', '') ; evtl. Platzhalter aus dem String entfernen
Local $sTxtFilename = StringFormat('%s\\%s\\txt\\%s.txt', @ScriptDir, ($bHKLM ? 'hklm' : 'hkcu'), $sFilename)
Local $sRegFilename = StringFormat('%s\\%s\\reg\\%s.reg', @ScriptDir, ($bHKLM ? 'hklm' : 'hkcu'), $sFilename)
If $sString = '' Then
MsgBox(64, "Hinweis", "Bitte Suchwort eingeben")
Return
EndIf
Opt('GUICloseOnESC', 0)
_GUICtrlListView_DeleteAllItems($idListview)
$iFoundCount = 0
_GUICtrlStatusBar_SetText($hStatus, $iFoundCount, 2)
GUICtrlSetState($idNormal, $GUI_DISABLE) ; Normal-Radio deaktivieren
GUICtrlSetState($idRegExp, $GUI_DISABLE) ; RegExp-Radio deaktivieren
GUICtrlSetState($idHKLM, $GUI_DISABLE) ; HKLM-Radio deaktivieren
GUICtrlSetState($idHKCU, $GUI_DISABLE) ; HKCU-Radio deaktivieren
GUICtrlSetState($idInput, $GUI_DISABLE) ; Inputfeld deaktivieren
GUICtrlSetState($idStart, $GUI_DISABLE) ; Startbutton deaktivieren
_GUICtrlStatusBar_SetText($hStatus, ' Suche nach -' & $sString & '- bitte warten!', 1)
_RegSearch($sFound, ($bHKLM ? 'HKLM' : 'HKCU'), $sString, $bRegExp)
If @error Then
_GUICtrlStatusBar_SetText($hStatus, ' Die Suche wurde abgebrochen!', 1) ; Statusmeldung ausgeben
GUICtrlSetState($idNormal, $GUI_ENABLE) ; Normal-Radio aktivieren
GUICtrlSetState($idRegExp, $GUI_ENABLE) ; RegExp-Radio aktivieren
GUICtrlSetState($idHKLM, $GUI_ENABLE) ; HKLM-Radio aktivieren
GUICtrlSetState($idHKCU, $GUI_ENABLE) ; HKCU-Radio aktivieren
GUICtrlSetState($idInput, $GUI_ENABLE) ; Inputfeld aktivieren
GUICtrlSetState($idStart, $GUI_ENABLE) ; Startbutton aktivieren
Opt('GUICloseOnESC', 1)
Return ; und die Funktion (ohne zu speichern) verlassen
EndIf
If $iFoundCount > 0 Then _GUICtrlListView_SetColumnWidth($idListview, 0, $LVSCW_AUTOSIZE)
Local $hFile_txt = FileOpen($sTxtFilename, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
If $hFile_txt <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
FileWrite($hFile_txt, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
FileClose($hFile_txt) ; <- das Handle wieder schliessen
EndIf
Local $hFile_reg = FileOpen($sRegFilename, BitOR($FO_CREATEPATH, $FO_OVERWRITE)) ; <- FileOpen liefert ein Handle zurueck
If $hFile_reg <> -1 Then ; <- nur ausfuehren, wenn FileOpen erfolgreich war
FileWriteLine($hFile_reg, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF)
FileWrite($hFile_reg, $sFound) ; <- FileWrite mit dem Handle (nicht mit dem Dateinamen!) ausfuehren
FileClose($hFile_reg) ; <- das Handle wieder schliessen
EndIf
Local $iMsgBoxAnswer = MsgBox(68, "Hinweis", "Auftrag erledigt. Die Auswertung wird nachfolgend angezeigt." & @CRLF & "Soll -RegSearch- für weitere Auswertungen geöffnet bleiben?", 0, $hgui)
Switch $iMsgBoxAnswer ; Switch ist schneller und einfacher, wenn Du sowieso nur auf eine Variable testest
Case $IDYES ;Ja (wenn Du statt der Zahl 6 die Konstante verwendest, brauchst Du das nicht mit "Ja" kommentieren)
_GUICtrlStatusBar_SetText($hStatus, ' ' & ($bHKLM ? 'HKLM' : 'HKCU') & " ausgewählt", 1)
ShellExecute($sTxtFilename, @SW_MAXIMIZE)
GUICtrlSetState($idNormal, $GUI_ENABLE) ; Normal-Radio aktivieren
GUICtrlSetState($idRegExp, $GUI_ENABLE) ; RegExp-Radio aktivieren
GUICtrlSetState($idHKLM, $GUI_ENABLE) ; HKLM-Radio aktivieren
GUICtrlSetState($idHKCU, $GUI_ENABLE) ; HKCU-Radio aktivieren
GUICtrlSetState($idInput, $GUI_ENABLE) ; Inputfeld aktivieren
GUICtrlSetState($idStart, $GUI_ENABLE) ; Startbutton aktivieren
Opt('GUICloseOnESC', 1)
Return
Case $IDNO ;Nein (wenn Du statt der Zahl 7 die Konstante verwendest, brauchst Du das nicht mit "Nein" kommentieren)
ShellExecute($sTxtFilename, @SW_MAXIMIZE)
__GUI_EVENT_CLOSE_()
EndSwitch
EndFunc ;==>_RegSearch_Start
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch, $bStringRegExp = False, $bRek = False) ; Funktion von Gorathan (https://forum.technik-hobby.de/showthrea...d=24#pid24)
Local $iValType, $sKeyName, $sValName, $vRegVal, $iEnumKey = 0, $iEnumVal = 0, $aTmp, $sTmp, $iRow, $sValidate
Local $iTimer = TimerInit(), $iTimerDiff = TimerDiff($iTimer)
If Not $bRek And Not $bStringRegExp Then ; wenn der Suchbegriff !kein! RegExp-Pattern enthält, dann die Platzhalter in RegExp wandeln
$sSearch = StringReplace($sSearch, '?', '.') ; "?" steht fuer ein beliebiges Zeichen, in RegExp ist das ein "."
$sSearch = StringReplace($sSearch, '*', '.*?') ; "*" steht fuer (k)ein oder mehrere beliebige Zeichen, in RegExp ist das ein ".*?"
$sSearch = '(?i)' & $sSearch ; Gross-/Kleinschreibung !nicht! beachten = "(?i)" an den Anfang des Suchbegriffs setzen
EndIf
While True
If _IsPressed("1B", $hDLL) Then ; die Abbruchbedingung muss in die Schleife, die abgebrochen werden soll
If MsgBox($MB_ICONQUESTION + $MB_YESNO, "Achtung", "Soll die Suche abgebrochen werden?", 0, $hgui) = $IDYES Then
Return SetError(1) ; Funktion mit Fehler 1 verlassen, damit alle rekursiven Aufrufe beendet werden
EndIf
EndIf
$iEnumKey += 1
$sKeyName = RegEnumKey($sRegPath, $iEnumKey)
If @error Then ExitLoop ; wenn kein weiterer RegKey gefunden wurde, dann Schleife verlassen
If TimerDiff($iTimer) - $iTimerDiff > 100 Then ; die Statuszeile nur alle 100ms aktualisieren
$iTimerDiff = TimerDiff($iTimer)
_GUICtrlStatusBar_SetText($hStatus, $sRegPath & '\' & $sKeyName, 1)
EndIf
$sValidate = StringReplace($sRegPath & '\' & $sKeyName, '\', '\\') ; Backslashes maskieren
If StringRegExp($sValidate, $sSearch) Then ; wenn Key gefunden, dann RegVals einfuegen -ANFANG-
$sFound &= '[' & $sRegPath & '\' & $sKeyName & ']' & @CRLF ; den RegKey merken
GUICtrlCreateListViewItem($sRegPath & '\' & $sKeyName, $idListview)
$iFoundCount += 1
_GUICtrlStatusBar_SetText($hStatus, $iFoundCount, 2)
$iEnumVal = 0
While True ; alle RegVals durchgehen
$iEnumVal += 1
$sValName = RegEnumVal($sRegPath & '\' & $sKeyName, $iEnumVal)
If @error Then ExitLoop ; wenn kein weiterer RegVal gefunden wurde, dann Schleife verlassen
$iValType = @extended ; den Registry-Typ merken
$vRegVal = RegRead($sRegPath & '\' & $sKeyName, $sValName) ; den Inhalt des RegVals auslesen
Switch $iValType ; versuche das Export-Registry-Format zu erstellen (ohne Gewaehr!)
Case $REG_NONE
$vRegVal = 'hex(0):' & $vRegVal
Case $REG_SZ
$vRegVal = StringReplace($vRegVal, '\', '\\') ; Backslashes maskieren
$vRegVal = StringReplace($vRegVal, '"', '\"') ; Anfuehrungszeichen maskieren
$vRegVal = '"' & $vRegVal & '"' ; String in Anfuehrungszeichen setzen
Case $REG_EXPAND_SZ
$vRegVal = StringToBinary($vRegVal, 2)
$aTmp = StringRegExp(Hex($vRegVal, 16), '[[:xdigit:]]{2}', 3)
$vRegVal = 'hex(2):'
$iRow = 0
For $i = 0 To UBound($aTmp) - 1
$vRegVal &= $aTmp[$i] & ','
If Int((StringLen($sValName) + StringLen($vRegVal) + 6) / 80) > $iRow And $i < UBound($aTmp) - 2 Then
$vRegVal &= '\' & @CRLF & ' '
$iRow += 1
EndIf
Next
$vRegVal &= '00,00'
Case $REG_BINARY
$aTmp = StringRegExp(Hex($vRegVal, 8), '[[:xdigit:]]{2}', 3)
$vRegVal = 'hex:'
$iRow = 0
For $i = 0 To UBound($aTmp) - 1
$vRegVal &= $aTmp[$i] & ','
If Int((StringLen($sValName) + StringLen($vRegVal) + 6) / 80) > $iRow And $i < UBound($aTmp) - 2 Then
$vRegVal &= '\' & @CRLF & ' '
$iRow += 1
EndIf
Next
$vRegVal = StringTrimRight($vRegVal, 1)
Case $REG_DWORD
$vRegVal = 'dword:' & Hex($vRegVal, 8)
Case $REG_DWORD_BIG_ENDIAN ; keine Ahnung!
$vRegVal = '$REG_DWORD_BIG_ENDIAN ' & $vRegVal
Case $REG_LINK ; keine Ahnung!
$vRegVal = '$REG_LINK ' & $vRegVal
Case $REG_MULTI_SZ
$vRegVal = StringToBinary($vRegVal, 2)
$aTmp = StringRegExp(Hex($vRegVal, 16), '[[:xdigit:]]{2}', 3)
$vRegVal = 'hex(7):'
$iRow = 0
For $i = 0 To UBound($aTmp) - 1
$vRegVal &= $aTmp[$i] & ','
If Int((StringLen($sValName) + StringLen($vRegVal) + 6) / 80) > $iRow And $i < UBound($aTmp) - 2 Then
$vRegVal &= '\' & @CRLF & ' '
$iRow += 1
EndIf
Next
$vRegVal &= '00,00'
Case $REG_RESOURCE_LIST ; keine Ahnung!
$vRegVal = '$REG_RESOURCE_LIST ' & $vRegVal
Case $REG_FULL_RESOURCE_DESCRIPTOR ; keine Ahnung!
$vRegVal = '$REG_FULL_RESOURCE_DESCRIPTOR ' & $vRegVal
Case $REG_RESOURCE_REQUIREMENTS_LIST ; keine Ahnung!
$vRegVal = '$REG_RESOURCE_REQUIREMENTS_LIST ' & $vRegVal
Case $REG_QWORD
$aTmp = StringRegExp(Hex($vRegVal, 16), '[[:xdigit:]]{2}', 3)
$sTmp = ''
For $i = UBound($aTmp) - 1 To 0 Step -1
$sTmp &= $aTmp[$i] & ','
Next
$vRegVal = 'hex(b):' & StringTrimRight($sTmp, 1)
EndSwitch
$sValName = ($sValName = '' ? '@=' : '"' & $sValName & '"=') ; Wenn RegVal = Leerstring, dann "@", ansonsten der ValName
$sFound &= $sValName & $vRegVal & @CRLF
WEnd
$sFound &= @CRLF
EndIf ; RegVals einfuegen -ENDE-
_RegSearch($sFound, $sRegPath & '\' & $sKeyName, $sSearch, $bStringRegExp, True) ; rekursiver Aufruf des gefundenen RegKeys
If @error Then Return SetError(1) ; Funktion mit Fehler 1 verlassen, damit alle rekursiven Aufrufe beendet werden
WEnd
Return
EndFunc ;==>_RegSearch
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Func __GUI_EVENT_CLOSE_()
_GUICtrlStatusBar_Destroy($hStatus)
DllClose($hDLL)
Exit
EndFunc ;==>__GUI_EVENT_CLOSE_
; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
Hinweise:
Ich benutze für den Arduino die Arduino-IDE.
Für AutoIt benutze ich die aktuelle AutoIt-Version sowie SciTE4AutoIt3.
Eine Hilfe kann ich nur auf Basis dieser Software leisten.
Ich benutze für den Arduino die Arduino-IDE.
Für AutoIt benutze ich die aktuelle AutoIt-Version sowie SciTE4AutoIt3.
Eine Hilfe kann ich nur auf Basis dieser Software leisten.