While Schleife beenden - wie Fehlermeldung von Windows benutzen

  • Servus Profis,

    ich werde in Zukunft immer wieder Mal ellenlange Wortlisten bearbeiten müssen. Diese sehen so aus:

    Wort\Kommentar

    Meine Bearbeitung besteht darin darin, dass ich ab dem Backslash alles löschen muss (inkl. Backslash). Dazu habe ich mit AutoIt dieses Script erstellt (Achtung Anfänger!):

    [autoit]


    Run("notepad.exe")
    WinWaitActive("Unbenannt - Editor")
    Send("!Df")
    Sleep(1000)
    Send("Liste.txt")
    Send("!f")
    Send("!Bu")
    Send("")
    Send("!W")
    Send("{Esc}")
    HotKeySet("{ESC}", "Terminate")
    Local $i = 0
    While $i < 10
    Send("{F3}")
    Send("{SHIFTDOWN}{End}{SHIFTUP}")
    Send("{DEL}")
    Sleep(500)
    $i = $i + 1
    WEnd
    Func Terminate()
    Exit 0
    EndFunc

    [/autoit]

    Mein Wunsch ist nun, dass das Script automatisch beendet, wenn der Suchstring nicht mehr gefunden wird. Ihr kennt sicher alle die Meldung von Windows.

    Außerdem funktioniert wohl der Abbruch mit Esc auch nicht.

    Nur wie geht das?

    Viele Grüße und danke im Voraus

    JaJar

    Einmal editiert, zuletzt von JarJarBinks (1. Dezember 2013 um 17:04) aus folgendem Grund: Frage wurde von Andy verständlich beantwortet.

  • Hi,
    wieso liest du nicht einfach die Textdatei ein, löschst in jeder Zeile alles ab dem \ und schreibst die Datei wieder?
    Das wird maximal ein 5-Zeiler und du musst dich nicht weiter um irgendwelche "Send"-Geschichten kümmern, welche in 90% aller Fälle genau dann NICHT funktionieren, wenn man sie am nötigsten braucht...

    [autoit]

    ;alles nach dem backslash bis zum zeilenende löschen und durch crlf ersetzen
    FileDelete("Test ohne Backslash.txt") ;Ergebnis löschen
    FileWrite("Test ohne Backslash.txt", StringRegExpReplace(FileRead(FileOpenDialog("Bitte Datei auswählen", @ScriptDir, "(*.txt)")), "(?m)(\\.*$)", @crlf)) ;schreiben
    ShellExecute("Test ohne Backslash.txt") ;anzeigen

    [/autoit]

    verkürzte Version als 3-Zeiler, bin zwar nicht der RegEx-Fan, aber bei solch einfachen Sachen bekomme selbst ich es gebacken^^

    In der "Langversion" wird eine Testdatei von 1.5MB Größe erstellt, und die Strings werden ersetzt

    Spoiler anzeigen
    [autoit]

    ;testdatei erstellen
    $text = "Wort1\blablub1" & @crlf & "Wort2\blablub2" & @crlf & "Wort3\blablub3" & @CRLF
    for $i = 1 to 15 ;"große" Textdatei erstellen, 1,5MB
    $text &= $text
    Next

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

    FileDelete("test.txt") ;Datei löschen
    FileWrite("test.txt", $text) ;Datei erstellen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $text = ' & StringLen($text) & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    ;alles nach dem Backslash in der Textdatei in jeder Zeile löschen
    $inhalt = FileRead("test.txt") ;Datei lesen
    $inhalt = StringRegExpReplace($inhalt, "(?m)(\\.*$)", @crlf);alles nach dem backslash bis zum zeilenende löschen und durch crlf ersetzen
    FileDelete("Test ohne Backslash.txt") ;Ergebnis löschen
    FileWrite("Test ohne Backslash.txt", $inhalt) ;schreiben
    ShellExecute("Test ohne Backslash.txt") ;anzeigen

    [/autoit]

    //EDIT und noch eine Version, wie ich sie "zu Fuß" schreiben würde, wenn ich keinerlei Ahnung von RegEx hätte

    Spoiler anzeigen
    [autoit]

    $inhalt = FileRead("test.txt") ;Datei lesen
    $pos = StringInStr($inhalt, "", 1) ;position Backslash
    do
    $crlf = StringInStr($inhalt, @crlf, 1, 1, $pos);Zeilenende suchen ab position Backslash
    $mid = StringMid($inhalt, $pos, $crlf - $pos + 1) ;string dazwischen incl crlf
    $inhalt = StringReplace($inhalt, $mid, @crlf, 0, 1);ersetzen mit crlf
    $pos = StringInStr($inhalt, "", 1) ;nächste backslash position
    until $pos = 0

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

    FileDelete("Test ohne Backslash.txt") ;Ergebnis löschen
    FileWrite("Test ohne Backslash.txt", $inhalt) ;schreiben
    ShellExecute("Test ohne Backslash.txt") ;anzeigen

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    5 Mal editiert, zuletzt von Andy (30. November 2013 um 19:21)

  • Servus Andy,

    herzlichen Dank für Deine Hilfe und Lösung meiner Aufgabenstellung.

    Vor allem Deine letzte Lösung verstehe ich am Besten; ich will ja nur hin und wieder Mal solche Intelligenzjobs auomatisieren.

    Und trotzdem würde mich interessieren, ob und wie man Meldungen von Windows abfangen und darauf reagieren kann. In meiner ersten Aufgabe wollte ich Tastendrücke in einer Applikation automatisieren. Dort kann es zu "störenden" Meldungen kommen, wenn der bearbeitete Datensatz Fehler beinhaltet. Auf diese Meldung möchte ich gerne reagieren und automatisch übergehen, weil die Datenkonsistenz für das nachfolgende Programm unkritisch ist.

    Viele Grüße

    JarJar

  • Hi,
    am allerbesten ist es, "Fehlermeldungen" erst garnicht entstehen zu lassen!
    Statt Energie darauf zu verwenden, Fehler zu kompensieren, sollte man lieber dafür sorgen, dass diese Fehler nicht auftreten.

    Zitat

    In meiner ersten Aufgabe wollte ich Tastendrücke in einer Applikation automatisieren. Dort kann es zu "störenden" Meldungen kommen, wenn der bearbeitete Datensatz Fehler beinhaltet.

    wenn du externe Programme steuern willst und die "Datensätze" nicht bereinigen kannst, dann hast du die Möglichkeit, mit dem AU3Info.EXE-Tool (schau mal im root-Verzeichnis von AutoIt) die nötigen Informationen aus dem "Fehlerfenster" zu ziehen und darauf zu reagieren.