Weshalb bekommen ich nicht die ArrayDisplay anzeige?

  • Hallo Zusammen
    Habe hier im Forum ein Script gefunden dass ich gerne für meine Ansprüche noch einwenig bearbeiten möchte, deshalb wäre ich Euch sehr Dankbar um Eure hilfe.

    Nachdem die Werte aus der Registrierung gezogen worden sind würde ich gern an den Werten HKEY.... folgendes hinzufügen ("[-" HKEY) und am Ende der Zeile eine Abschliessende "]"). mache ich dies mit Stringsearch und StringRegExpReplace

    Danke für die Hilfe oder Info's die ich hier bekommen kann.
    Mauri

    Spoiler anzeigen
    [autoit]

    #include<File.au3>
    #include<array.au3>
    $sFound = ''
    ;$sFile = @ScriptDir & "\Test.txt"
    _RegSearch($sFound, 'HKLM', 'Citrix')
    If IsArray($sFound) Then
    _ArrayDisplay($sFound)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch)
    Local $sKey, $sVal, $sVar, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If @error Then ExitLoop
    _RegSearch($sFound, $sRegPath & '\' & $sKey, $sSearch)
    $j = 0
    While True
    $j += 1
    $sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
    If @error Then ExitLoop
    $sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
    If StringInStr($sVar, $sSearch, 2) Then $sFound &= $sRegPath & '\' & $sKey & '\' & $sVal & @CRLF
    WEnd
    WEnd
    Return
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von mauric (28. April 2011 um 11:35)

  • Ich seh hier in der Funktion keinen Abschnitt in welcher ein Array erstellt wird. Und da du überprüfst ob ein Array vorhanden ist, und nur die Anzeige bekommst wenn dem so ist, springt er am ArrayDisplay vorbei.

  • Die Funktion erzeugt einen String, daher wurde die globale Variable $sFound wohl auch mit einem "s" benannt. Anzeigen kannst du diesen String mit einer msgbox.
    Wenn du ein Array haben willst benutze stringsplit:

    [autoit]


    $myArray=stringsplit($sFound,@CRLF,1)

    [/autoit]
    • Offizieller Beitrag

    Du hattest ja schon per PN nach einer Änderung meiner Funktion gefragt.
    Hier habe ich mal zwei Funktionen zum Suchen in der Registry:

    Spoiler anzeigen
    [autoit]


    MsgBox(0, 'Key-Search', _RegKeySearch('HKEY_LOCAL_MACHINE', 'AutoIt v3'))
    MsgBox(0, 'Val-Search', _RegValSearch('HKEY_LOCAL_MACHINE', 'v3.3.6.1'))

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegKeySearch($sRegPath, $sKeySearch)
    Local $sKey, $sVal, $sVar, $ret, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If $sKey == $sKeySearch Then Return $sRegPath & '\' & $sKey
    If @error Then ExitLoop
    $ret = _RegKeySearch($sRegPath & '\' & $sKey, $sKeySearch)
    If $ret <> '' Then ExitLoop
    WEnd
    Return $ret
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegValSearch($sRegPath, $sValSearch)
    Local $sKey, $sVal, $sVar, $ret, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If @error Then ExitLoop
    $ret = _RegValSearch($sRegPath & '\' & $sKey, $sValSearch)
    If $ret <> '' Then ExitLoop
    $j = 0
    While True
    $j += 1
    $sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
    If @error Then ExitLoop
    $sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
    If $sVar == $sValSearch Then Return $sRegPath & '\' & $sKey & '\' & $sVal
    WEnd
    WEnd
    Return $ret
    EndFunc

    [/autoit]


    Einmal kannst Du nach einem Key suchen lassen und die andere Funktion ist zum suchen nach einem Wert.
    Es muss aber der ganze Key/Wert übergeben werden, nicht nur ein Bruchstück. Wenn das gewünscht ist, muss der Vergleich mit StringInStr oder StringRegExp erfolgen.

  • Danke der Meldungen!
    Bin nun auch wieder ein Stück weiter gekommen doch ein Löschen auch wenn ich Adminrechte habe ist immer noch nicht möglich :(
    Bitte um Hilfe
    Mauri

    Spoiler anzeigen
    [autoit]


    #include<File.au3>
    #include<array.au3>
    $sFound = ''
    $sFile = @ScriptDir & "\Test.txt"
    $aFile = _RegSearch($sFound, 'HKLM', 'Citrix')

    [/autoit] [autoit][/autoit] [autoit]

    $aFile = StringSplit($sFound, @LF)
    _ArrayDisplay($aFile)

    [/autoit] [autoit][/autoit] [autoit]

    ;$counter = _ArrayAdd($aFile, "End") - 2
    $counter = _aFile[0] - 1
    msgbox(0, "zähler", $counter)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to $counter
    $aFile1 = StringSplit($aFile[$i], "\")
    $KeyValue = $aFile1[$aFile1[0]]
    $KeyName = $aFile1[$aFile1[0] - 1]
    RegDelete($aFile[$i])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $sFound = ''

    [/autoit] [autoit][/autoit] [autoit]

    $aFile = StringSplit($sFound, @LF)
    _ArrayDisplay($aFile)

    [/autoit] [autoit][/autoit] [autoit]

    ;EndIf
    Func _RegSearch(ByRef $sFound, $sRegPath, $sSearch)
    Local $sKey, $sVal, $sVar, $i = 0, $j = 0
    While True
    $i += 1
    $sKey = RegEnumKey($sRegPath, $i)
    If @error Then ExitLoop
    _RegSearch($sFound, $sRegPath & '\' & $sKey, $sSearch)
    $j = 0
    While True
    $j += 1
    $sVal = RegEnumVal($sRegPath & '\' & $sKey, $j)
    If @error Then ExitLoop
    $sVar = RegRead($sRegPath & '\' & $sKey, $sVal)
    If StringInStr($sVar, $sSearch, 2) Then $sFound &= $sRegPath & '\' & $sKey & '\' & $sVal & @LF
    WEnd
    WEnd
    Return
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von mauric (28. April 2011 um 14:08)

  • Arbeitest du mit Windows Vista/7? Falls ja solltest du am Anfang noch ein #RequireAdmin hinzufügen.

  • Das was du machst ist extrem mutig, man sollte erstmal prüfen ob alles funktioniert bevor man wirklich registry keys löscht.
    Dein Fehler ist bereits in Zeile 11:

    [autoit]


    $counter = _aFile[0] - 1
    ; muss so lauten:
    $counter = $aFile[0] - 1 ; wobei die -1 wohl auch falsch sein dürfte ausser du willst bewusst nur bis zum vorletzten Element

    [/autoit]

    Ob danach alles passt kA. Du solltest in jedem Fall Prüfungen einhbauen was dir die stringsplit Funktionen zurückgeben und im Fall der Fälle eben die Fehler Abfangen.

  • Hallo Zusammen
    Ich weiss genau was ich will und ich weiss auch ganz genau was ich mache :-)!.

    Leider werden diese Einträge immer noch nicht gelöscht. Ich vemute dass es noch mit "Key" oder "Value" zu tun hatt.
    Wäre um Hilfe wirklich agewiesen.
    Danke
    Mauri

  • Ich bezweifel, dass du weisst was du machst. Du weisst vielleicht was du machen willst, aber ob dein Programm auch das tut was du möchtest ist ja wieder die Frage.

    Ich weiss zum Beispiel schonmal nicht welchen Sinn die ersten 3 Zeilen in deiner For Schleife haben, da du die gewonnenen Teilstrings überhaupt nicht in deinem regdelete benutzt. Du könntest die Zeilen genausogut auskommentieren und würdest das selbe tun. Du löschst hier registry Schlüssel innerhalb einer Schleife ohne wirklich sicher zu sein, dass das was gelöscht wird auch das ist was du löschen willst. Zum Testen solltest du die regdelete Zeile durch eine msgbox ersetzen, denn nur so kannst du sicher sein, dass bis hierhin alles passt und der korrekte Schlüssel gelöscht werden soll. Sobald du das 100% bejahen kannst kannst du das Risiko eingehen und eine regdelete Zeile einbauen. Um den Erfolg der Löschung zu kontrollieren lässt man sich dann die Rückgabewerte von Regdelete ausgeben, daran kannst du dann durch die Hilfe auch erkennen warum die Löschung nicht klappt.

    [autoit]


    For $i = 1 to $counter
    $aFile1 = StringSplit($aFile[$i], "\")
    $KeyValue = $aFile1[$aFile1[0]] ; benutzt du später nicht
    $KeyName = $aFile1[$aFile1[0] - 1] ; benutzt du auch nicht...
    RegDelete($aFile[$i])
    Next

    [/autoit]

    EDIT: Nicht falsch verstehen, aber ich halte nix von FaceBook und Co. daher lehne ich auch Freundschaftsangebote in WBB Foren ab. Das ist nix persönliches, aber ich sehe keinen Sinn hinter dieser virtuellen Freunde Sammlerei.

    Einmal editiert, zuletzt von misterspeed (28. April 2011 um 16:25)

  • Danke misterspeed der schnellen Antwort, Ich habe kurz eine MSGBOX nun erstellt und es erscheinen nun 521 löschnugsmeldungen.
    Ich habe aber bemerkt dass der letzte "unterstrichene teil" ein "Valuename" ist aber ich sollte den "KEYNAME" löschen. Also den im Quadrat markierten bereich.

    Mit der IF Schlefe habe ich versucht eine "Zeile" nach oben zu springen und diesen eintrag "KEYNAME" so zu löschen. bitte nicht Schlagen :)
    Danke Gruss
    Mauri