"Zeilen vergleichen"

  • Salve,

    ich möchte aus einer Datei Zeilen einlesen und wenn die Zeile bestimmte Zeichen wie z.B. "[][]" enthält, dann soll der Zeileninhalt mit dem Inhalt der zuvor eingelesenen Zeile mit den Zeichen "[][]" verglichen werden. (Falls zuvor schon eine Zeile mit den Zeichen "[][]" eingelesen wurde.)

    Beispiel:

    Zeile 1: Hallo Welt ! => Zeile ignorieren, nächste Zeile einlesen

    Zeile 2: [D:\Programme\AutoIt3] => Zeile in Datei schreiben

    Zeile 3: [D:\Programme\AutoIt3\SciTE] => Zeile ignorieren, wenn Zeile 3 Zeile 2 beinhaltet

    Zeile 4: [D:\Programme\Schnulli] => Zeile wird in Datei geschrieben


    So soll der Ablauf sein, aber ich kriege es einfach nicht hin..., bei meinem Script wird eine Endlosschleife erzeugt , schon beim lesen, es wird nichts geschrieben ! :irre:

    Spoiler anzeigen
    [autoit]


    Local $vResult, $vRes, $Unkeyname
    $file = FileOpen($regsource, 0)
    if @error = 1 Then MsgBox(0,"error", "error")

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

    While 1
    $line = FileReadLine($file)

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

    $sPattern = "[][]"
    $vResult = StringRegExp($line, $sPattern, 1)
    Select
    Case @error = 0
    If @extended Then
    $vCompare1 = StringRegExpReplace(StringRegExpReplace($line, $sPattern, ""), "\\", "")
    $vCompare2 = StringRegExpReplace(StringRegExpReplace($Unkeyname, '"', ""), "\\", "")
    $vRes = StringRegExp($vCompare1, $vCompare2, 1)
    Select
    Case @error = 1
    $Unkeyname = StringRegExpReplace($line, $sPattern, '"')
    FileWriteLine($UnRegScript, "RegDelete(" & $Unkeyname & ")")
    Case @error = 0
    EndSelect
    EndIf
    Case @error = 1
    EndSelect

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

    WEnd

    [/autoit]


    • Offizieller Beitrag

    Hier eine Variante von mir.
    So, wie ich das lese, willst du nur mit der vorhergehenden Zeile vergleichen.

    [autoit]

    ; aktuelle Prod oder Beta benutzen
    #include <File.au3>
    #include <String.au3>

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

    Dim $arFile, $pfadRead = "D:\beispiel.txt", $pfadWrite = "D:\WriteBack.txt", $write, $tmp, $last = ""

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

    If _FileReadToArray($pfadRead, $arFile) = 0 Then
    MsgBox(0, 'Achtung', "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf
    $write = FileOpen($pfadWrite, 1)
    For $i = 1 To $arFile[0]
    $tmp = $arFile[$i]
    $tmp = _StringBetween($tmp, "[", "]")
    If $last = "" Then
    FileWriteLine($write, $tmp)
    $last = $tmp
    Else
    If Not StringInStr($last, $tmp) Then
    FileWriteLine($write, $tmp)
    $last = $tmp
    EndIf
    EndIf
    Next
    FileClose($write)
    Exit

    [/autoit]
  • @th.meger

    Zeit ist Wurscht => nur das Ergebnis zählt !!!

    Ich möchte nur die Hauptschlüssel in eine Datei schreiben, nicht die SubKeys !

    Es soll praktisch so aussehen

    [HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3] => wird in Datei geschrieben

    [HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt] => wird ignorriert, nicht geschrieben

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script] => wird in Datei geschrieben

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\DefaultIcon] => wird ignorriert, nicht geschrieben

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell] => wird ignorriert, nicht geschrieben

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoItX3.Control] => wird in Datei geschrieben

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoItX3.Control.1] => wird in Datei geschrieben

    Alle anderen Zeilen die nicht "[" und "]" sollen auch ignorriert werden !

    =============

    BugFix

    Vielen Dank an dich, ich werde versuchen dein Script einzubauen ! ;)

    Gruß

    p.s. Im Moment versuche ich es so, aber ohne nennenswerten Erfolg

    Spoiler anzeigen
    [autoit]


    Local $vResult, $vRes, $Unkeyname, $NewLine
    $OldLine = "W"
    $file = FileOpen($regsource, 0)
    if @error = 1 Then MsgBox(0,"error", "error")

    While 1
    $line = FileReadLine($file)

    $sPattern = "[][]"
    $vResult = StringRegExp($line, $sPattern, 1)
    If @extended Then
    $vRes = StringRegExp($line, $OldLine, 1)
    Select
    Case @error = 1
    $Unkeyname = StringRegExpReplace($line, $sPattern, "")
    $NewLine = StringSplit($Unkeyname, "\")
    $OldLine = $NewLine[UBound($NewLine) -1]
    FileWriteLine($UnRegScript, 'RegDelete("' & $Unkeyname & '")')
    Case @error = 0
    EndSelect
    EndIf


    WEnd

    [/autoit]


    3 Mal editiert, zuletzt von Greenhorn (21. Januar 2007 um 20:57)

  • Hi @all,

    zur Zeit versuche ich mich hiermit etwas zu werden, jedoch schreibt er als Ergebnis alle Zeilen, also auch die, welche ich nicht sehen möchte... :

    Spoiler anzeigen
    [autoit]

    Dim $arFile, $write, $tmp, $last

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


    If _FileReadToArray($regsource, $arFile) = 0 Then
    MsgBox(0, 'Achtung', "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf

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

    For $i = 1 To UBound($arFile)
    $tmp = $arFile[$i]
    If StringInStr($arFile[$i], "[") Then
    $tmp1 = _StringBetween($tmp, "[", "]")
    $last1 = _StringBetween($last, "[", "]")

    If StringInStr($tmp1, $last1) Then
    $last = $arFile[$i]
    _ArrayDelete($arFile, $i)

    Else
    If Not StringInStr($tmp1, $last1) Then
    FileWriteLine($UnRegScript, $arFile[$i])
    $last = $arFile[$i]

    EndIf
    EndIf
    EndIf

    Next

    [/autoit]
    Spoiler anzeigen
    [autoit]


    [HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3] ; => o.k. will ich haben
    [HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt] ; => NEIN will ich nicht haben
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script] ; => o.k.
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\DefaultIcon] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Compile] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Compile\Command] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Compile with Options] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Compile with Options\Command] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Edit] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Edit\Command] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Open] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Open\Command] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Run] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Run\Command] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Tidy] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3Script\Shell\Tidy\Command] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3XScript] ; => o.k.
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3XScript\DefaultIcon] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3XScript\Shell] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3XScript\Shell\Run] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoIt3XScript\Shell\Run\Command] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoItX3.Control] ; => o.k.
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoItX3.Control\CLSID] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoItX3.Control\CurVer] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoItX3.Control.1] ; => o.k.
    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AutoItX3.Control.1\CLSID] ; => NEIN
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AutoIt3.exe]
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Aut2Exe.exe] ; => NEIN
    [HKEY_CURRENT_USER\Software\Classes\Applications\AutoIt3.exe] ; => o.k.
    [HKEY_CURRENT_USER\Software\Classes\Applications\AutoIt3.exe\shell] ; => NEIN
    [HKEY_CURRENT_USER\Software\Classes\Applications\AutoIt3.exe\shell\open] ; => NEIN
    [HKEY_CURRENT_USER\Software\Classes\Applications\AutoIt3.exe\shell\open\command] ; => NEIN
    [HKEY_CURRENT_USER\Software\AutoIt v3] ; => o.k.
    [HKEY_CURRENT_USER\Software\AutoIt v3\AU3Info] ; => NEIN
    [HKEY_CURRENT_USER\Software\AutoIt v3\Aut2Exe] ; => NEIN
    [HKEY_CURRENT_USER\Software\AutoIt v3\Exe2Aut] ; => NEIN

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

    Als Anfänger ist es ziemlich schwer das ganze zu verstehen, daher wäre ich für weitere Tips dankbar !

    Gruß

    p.s. Der Compiler führt das Programm aus zeigt aber eine Fehlermeldung bei beenden:
    ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:


    3 Mal editiert, zuletzt von Greenhorn (22. Januar 2007 um 18:45)

    • Offizieller Beitrag

    Sorry, aber mir ist in meinem Code ein Fehler unterlaufen. Ich hatte nicht dran gedacht, dass _StringBetween( ) ein Array zurückgibt. ;)
    Also hier das funktionsfähige Ergebnis.
    In deiner Auflistung der Keys widersprichst du aber deiner Regel, dass du alle Hauptschlüssel auslesen willst.
    Diese beiden Zeilen willst du nicht haben:

    Zitat

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AutoIt3.exe
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Aut2Exe.exe

    Sie entsprechen aber deiner Regel, dass der Schlüssel das erste Mal auftreten muss und nicht im vorigen enthalten ist.

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <String.au3>

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

    Dim $arFile, $pfadRead = "Source.txt", $pfadWrite = "WriteBack.txt", $write, $tmp, $str, $last = ""

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

    If _FileReadToArray($pfadRead, $arFile) = 0 Then
    MsgBox(0, 'Achtung', "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf
    $write = FileOpen($pfadWrite, 1)
    For $i = 1 To $arFile[0]
    $tmp = $arFile[$i]
    $str = _StringBetween($tmp, "[", "]")
    If $last = "" Then
    FileWriteLine($write, $str[0])
    $last = $str[0]
    Else
    If Not StringInStr($str[0], $last) Then
    FileWriteLine($write, $str[0])
    $last = $str[0]
    EndIf
    EndIf
    Next
    FileClose($write)
    Exit

    [/autoit]
    • Offizieller Beitrag

    Also bei mir läuft es. Ich vermute, du hast bei der Anpassung an deine Variablennamen einen Fehler drin. Aufgrund des Fehlermeldung tippe ich auf die Rückgabevariable von _StringBetween( ) .

    Ich habe jetzt mal die von dir verwendeten Variablennamen eingebaut, in der Hoffnung, dass ich richtig liege in meiner Einschätzung, welche wofür ist. ;)
    Außerdem habe ich jetzt mal jede Zeile kommentiert, damit du genau nachvollziehen kannst, was wo passiert.

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <String.au3>

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

    Dim $arFile ; das Array nimmt die Quelldatei auf
    Dim $regsource = "Source.txt" ; der Pfad der Quelldatei
    Dim $UnRegScript = "WriteBack.txt" ; der Pfad der Ergebnisdatei
    Dim $write ; das Filehandle für die zum Schreiben geöffnete Ergebnisdatei
    Dim $tmp, $str ; temporäre Variablen
    Dim $last = "" ; enthält den zuletzt geschriebenen Eintrag

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

    If _FileReadToArray($regsource, $arFile) = 0 Then
    MsgBox(0, 'Achtung', "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf
    $write = FileOpen($UnRegScript, 1) ; Zuweisung Datei an Filehandle
    For $i = 1 To $arFile[0]
    $tmp = $arFile[$i] ; aktuelle Zeile
    $str = _StringBetween($tmp, "[", "]") ; Zeileninhalt zwischen den Klammern an Arrayvariable
    If $last = "" Then ; ausführen bei erster Zeile
    FileWriteLine($write, $str[0]) ; Zeile in Zieldatei schreiben
    $last = $str[0] ; Zuweisen letzter geschriebener Wert
    Else ; für alle anderen Zeilen
    If Not StringInStr($str[0], $last) Then ; wenn letzter Eintrag nicht in aktueller Zeile -> dann
    FileWriteLine($write, $str[0]) ; Zeile in Zieldatei schreiben
    $last = $str[0] ; Zuweisen letzter geschriebener Wert
    EndIf
    EndIf
    Next
    FileClose($write) ; Filehandle schließen
    Exit

    [/autoit]
  • Moin BugFix,

    erstmal vielen, vielen Dank für die aktive Unterstützung ! ! !

    Die Fehlermeldung ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: ist in Zeile 14 mit dem erten vorkommen von $str[0] !

    Hab's zerst ohne eigene Variablen getestet, da kam die Fehlermeldung auch schon...


    Für einen besseren Überblick hier mal das Gesamtwerk...
    Das Problemkind ist die Func Unregister() !

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $regsource
    Global $regdest
    Global $file
    Global $RegScript
    Global $UnRegScript
    Global $msg, $line, $keyname, $value, $value1, $value2, $filename

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

    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>
    #include <GuiConstants.au3>

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

    ; GUI Reg2Au3 Converter
    GUICreate("Reg2Au3 Converter", 392, 316, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))

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

    $Group_1 = GUICtrlCreateGroup("", 10, 20, 370, 150)
    $Label_1 = GUICtrlCreateLabel("Quelldatei auswählen", 30, 50, 140, 20)
    $Input_1 = GUICtrlCreateInput("", 30, 70, 200, 20)
    $Button_1 = GUICtrlCreateButton("&Durchsuchen...", 260, 70, 100, 20)
    $Label_2 = GUICtrlCreateLabel("Zieldatei auswählen", 30, 110, 120, 20)
    $Input_2 = GUICtrlCreateInput("", 30, 130, 200, 20)
    $Button_2 = GUICtrlCreateButton("&Durchsuchen...", 260, 130, 100, 20)

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

    $Unreg = GUICtrlCreateCheckbox("UnRegScript erstellen", 20, 180)

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

    $SameFile = GUICtrlCreateRadio('In "RegScript.au3" schreiben', 20, 220)
    $OwnFile = GUICtrlCreateRadio('"UnRegScript.au3" erstellen', 20, 250)

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

    $Button_Start = GUICtrlCreateButton("&Start", 280, 240, 80, 20)
    $Button_Beenden = GUICtrlCreateButton("&Beenden", 280, 280, 80, 20)

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

    GUISetState()
    GUICtrlSetState($SameFile, $GUI_DISABLE)
    GUICtrlSetState($OwnFile, $GUI_DISABLE)

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

    While 1

    $msg = GUIGetMsg()
    Select
    Case $msg = 0
    ContinueLoop
    Case $msg = $Button_1
    $regsource = FileOpenDialog("Registrierungsdatei wählen", @MyDocumentsDir, "(*.reg)", 1 + 4)
    ControlSetText("Reg2Au3 Converter", "", $Input_1, $regsource)
    Case $msg = $Button_2
    DestDir()
    If @error Then MsgBox(4096, "", "Save cancelled.")
    Case $msg = $Unreg
    If GUICtrlRead($Unreg) = $GUI_CHECKED Then
    GUICtrlSetState($SameFile, $GUI_ENABLE)
    GUICtrlSetState($OwnFile, $GUI_ENABLE)
    Endif

    Case $msg = $SameFile
    If GUICtrlRead($SameFile) = $GUI_CHECKED Then $UnRegScript = FileOpen($regdest, 1)
    Case $msg = $OwnFile
    If GUICtrlRead($OwnFile) = $GUI_CHECKED Then
    $array = StringSplit($regdest, "\")
    _ArrayPop($array)
    $string = _ArrayToString($array, "\", 1)
    $UnRegScript = FileOpen($string & "\UnRegScript.au3", 2)
    EndIf
    Case $msg = $Button_Start
    If GUICtrlRead($Unreg) = $GUI_CHECKED Then
    Register()
    Unregister()
    Else
    Register()
    EndIf
    FileClose($file)
    FileClose($RegScript)
    FileClose($UnRegScript)
    Case $msg = $Button_Beenden
    Exit
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case Else
    ;;;
    EndSelect
    WEnd

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

    Exit

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

    ; Funktion .reg zu .au3
    Func Register()

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

    $file = FileOpen($regsource, 0)
    $RegScript = FileOpen($regdest, 2)

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

    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open .reg file.")
    Exit
    ElseIf $RegScript = -1 Then
    MsgBox(0, "Error", "Unable to open RegScript.au3.")
    Exit
    Else
    If $file = -1 And $RegScript = -1 Then
    MsgBox(0, "Error", "Unable to open any file.")
    Exit
    EndIf
    EndIf

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

    $RegASCI = StringReplace(FileGetShortName($regsource), ".reg", ".old")
    RunWait(@ComSpec & " /c type " & FileGetShortName($regsource) & ">" & $RegASCI, @MyDocumentsDir)
    FileCopy($RegASCI, $regsource, 1)
    FileDelete($RegASCI)

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

    While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    Local $sPattern, $vResult, $clip, $clip1

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

    $sPattern = "[][]"
    $vResult = StringRegExp($line, $sPattern, 1)
    If @extended Then
    $keyname = StringRegExpReplace($line, $sPattern, '"')
    FileWriteLine($RegScript, "RegWrite(" & $keyname & ")")
    EndIf

    $sPattern = "(@=)"
    $vResult = StringRegExp($line, $sPattern, 1)
    If @extended Then
    $clip = StringRegExpReplace($line, $sPattern, "")
    $clip_0 = StringRegExpReplace($clip, "\\" & '"', "")
    $value = StringRegExpReplace($clip_0, "\\\\", "\\", 0)
    FileWriteLine($RegScript, "RegWrite(" & $keyname & ', "", "REG_SZ", ' & $value & ")")
    EndIf

    $sPattern = '("=")'
    $vResult = StringRegExp($line, $sPattern, 1)
    If @extended Then
    $clip_1 = StringRegExpReplace($line, '"="', '", "REG_SZ", "')
    $value1 = StringRegExpReplace($clip_1, "\\\\", "\\", 0)
    FileWriteLine($RegScript, "RegWrite(" & $keyname & "," & $value1 & ")")
    EndIf
    $sPattern = "(=dword:)"
    $vResult = StringRegExp($line, $sPattern, 1)
    If @extended Then
    $hex = StringRight($line, 8)
    $dec = Dec($hex)
    $value2 = StringRegExpReplace($line, "=dword:" & $hex, ', "REG_DWORD", "' & $dec)
    FileWriteLine($RegScript, "RegWrite(" & $keyname & "," & $value2 & '")')
    EndIf
    WEnd

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

    EndFunc ;==>Register

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

    ; Funktion Unregister

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

    Func Unregister()

    ; aktuelle Prod oder Beta benutzen

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


    Dim $arFile, $write, $tmp, $last

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


    If _FileReadToArray($regsource, $arFile) = 0 Then
    MsgBox(0, 'Achtung', "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf

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

    For $i = 1 To UBound($arFile)
    $tmp = $arFile[$i]
    If StringInStr($arFile[$i], "[") Then
    $tmp1 = _StringBetween($tmp, "[", "]")
    $last1 = _StringBetween($last, "[", "]")

    If StringInStr($tmp1, $last1) Then
    $last = $arFile[$i]
    _ArrayDelete($arFile, $i)

    Else
    If Not StringInStr($tmp1, $last1) Then
    FileWriteLine($UnRegScript, $arFile[$i])
    $last = $arFile[$i]

    EndIf
    EndIf
    EndIf

    Next
    FileClose($UnRegScript)
    Exit

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

    EndFunc ;==>Unregister

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

    ; Funktion Zieldatei
    Func DestDir()
    ; option 2 = dialog remains until valid path/file selected
    $regdest = FileSaveDialog("Zielpfad wählen", @MyDocumentsDir, "Scripts (*.aut;*.au3)", 2, "RegScript.au3")
    $check = StringRegExp($regdest, "(.au3)", 1)
    ; Dateiendung .au3 anhängen
    Select
    Case @error = 0
    if @extended then ControlSetText("Reg2Au3 Converter", "", $Input_2, $regdest)
    Case @error = 1
    ControlSetText("Reg2Au3 Converter", "", $Input_2, $regdest & ".au3")
    EndSelect
    EndFunc

    [/autoit]

    :rofl:


    Gruß


    Einmal editiert, zuletzt von Greenhorn (23. Januar 2007 um 16:52)

    • Offizieller Beitrag

    Hi, ich hab deine Funktion Unregister( ) mal etwas ausgebessert.
    Aber ich kann nicht richtig nachvollziehen, ob du mit dieser Logik den gewünschten Erfolg erzielst.
    Tipp: Anstatt Leerzeilen zwischen den Einzelschritten einzufügen, achte besser darauf, dass alle Unterschritte auch tiefer eingerückt sind. Das macht den Code wesentlich lesbarer.

    Spoiler anzeigen
    [autoit]

    Func Unregister()
    Dim $arFile, $write, $tmp, $last
    If _FileReadToArray($regsource, $arFile) = 0 Then
    MsgBox(0, 'Achtung', "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf
    For $i = 1 To UBound($arFile) -1 ; -1 muß sein, sonst bist du ausserhalb des Arrays
    $tmp = $arFile[$i]
    If StringInStr($arFile[$i], "[") Then
    $tmp1 = _StringBetween($tmp, "[", "]") ; _StringBetween( ) gibt ein Array zurück!!
    $last1 = _StringBetween($last, "[", "]")
    If StringInStr($tmp1[0], $last1[0]) Then ; also auch als Array abfragen
    $last = $arFile[$i]
    _ArrayDelete($arFile, $i) ; -> warum?
    Else
    If Not StringInStr($tmp1[0], $last1[0]) Then ; hier das Gleiche (Array)
    FileWriteLine($UnRegScript, $arFile[$i])
    $last = $arFile[$i]
    EndIf
    EndIf
    EndIf
    Next
    FileClose($UnRegScript)
    Exit
    EndFunc ;==>Unregister

    [/autoit]
  • Sorry, das Script ist schon ziemlich zerhackt, durch die ganzen Versuche... :rolleyes:


    [autoit]

    _ArrayDelete($arFile, $i) ; -> warum?

    [/autoit]


    Ich wollte versuchen den ganzen Array zu durch suchen und die unnötigen Einträge mit

    [autoit]

    _ArrayDelete

    [/autoit]

    llöschen, dann mit

    [autoit]

    _FileWriteFromArray

    [/autoit]

    schreiben...
    Aber wie gesagt, ziemlich durchenander im Moment.

    Gruß


    Edit:

    Juhuuuuuu ! :party3: :party4: :party3:

    Habe es so hinbekommen, dass ich damit erstmal etwas anfangen kann...

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>

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

    $RegASCI = StringReplace(FileGetShortName("D:\Eigene Dateien\Register-1.reg"), ".reg", ".old")
    RunWait(@ComSpec & " /c type " & FileGetShortName("D:\Eigene Dateien\Register-1.reg") & ">" & $RegASCI, @MyDocumentsDir)
    FileCopy($RegASCI, "D:\Eigene Dateien\Register-1.reg", 1)
    FileDelete($RegASCI)

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

    Dim $arFile, $str, $v, $tmp
    Dim $pfadRead = FileOpen("D:\Eigene Dateien\Register-1.reg", 0)
    Dim $pfadWrite = FileOpen("Temp.txt", 2)
    Dim $oldline = "w"

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

    $result = FileOpen(@MyDocumentsDir & "\RegScript.txt", 2)

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

    While 1
    $line = FileReadLine($pfadRead)
    If @error = -1 Then ExitLoop

    Local $sPattern, $vResult

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

    $sPattern = "[][]"
    $vResult = StringRegExp($line, $sPattern, 1)
    If @extended Then
    $keyname = StringRegExpReplace($line, $sPattern, "")
    FileWriteLine($pfadWrite, $keyname)
    EndIf
    WEnd
    FileClose($pfadWrite)
    If _FileReadToArray("Temp.txt", $arFile) = 0 Then
    MsgBox(0, 'Achtung', "Datei konnte nicht eingelesen werden!")
    Exit
    EndIf
    For $i = 1 To UBound($arFile)-1
    $tmp = $arFile[$i]
    $tmp1 = $tmp & "\"
    $Pos = _ArraySearch ($arFile, $tmp1, 0, 0, 0, True)
    Select
    Case $Pos = -1
    Sleep(0)
    Case Else
    If $tmp1 = "\" Then ExitLoop
    $v = _ArrayDelete($arFile, $Pos)
    $i = $i-1
    EndSelect
    Next
    _ArrayDelete($arFile, 0)
    _FileWriteFromArray("Temp1.txt", $arFile)

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

    FileClose("Temp1.txt")
    FileClose($pfadRead)
    Exit

    [/autoit]

    1ooo Dank nochmal an dich, BugFix !

    Deine Lehrstunden in Sachen Arrays waren nicht Fruchtlos !!! :kiss:


    Gruß


    3 Mal editiert, zuletzt von Greenhorn (23. Januar 2007 um 23:46)