Ausgangssituation sind die Output-Zeilen von AutoIt bei "Run", "Compile", usw. wie sie z. B. in SciTE zu sehen sind. Für mein PSPad4AutoIt3 Projekt will ich die Fehlerzeilen aus dem Log-Fenster herausgefiltern, sowie den Pfad zum Script auslesen und Angaben ersetzten.
Folgende Arten von Fehlermeldungen sind mir bekannt:
Zitat"D:\test files\FileQuantityLimit (Testdatei).au3"(112,16) : warning: $iTest possibly not declared/created yet
"D:\test files\FileQuantityLimit (Testdatei).au3"(131,11) : error: zzzz(): undefined function.
"D:\test files\FileQuantityLimit (Testdatei).au3" (163) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
Erstes Suchkriterium sind error, warning und der Pfeil "==>", anhand derer die entsprechenden Zeilen gefunden werden können.
Das zweite Kriterium sind die 2 Zahlenangaben, getrennt durch ein Komma, eingeschlossen in runde Klammern.
Als drittes Kriterium steht der Pfad zum Script, der nicht nur erkannt, sondern ausgelesen werden soll.
Zusätzlich soll bei der Variante mit nur 1 Zahlenwert ein Komma und "1" hinzugefügt werden, sodass es auch dort 2 Zahlenangaben sind: Z. B. aus (163) wird (163,1). Auch ein "error:" soll hinzugefügt werden, damit der Higlighter die Fehlerzeile als solche einfärbt.
Erste Problematik ist, dass in Pfadangaben/Dateinamen einige der Suchkriterien vorkomen können, z. B. Zahlenangaben (123,17), der Pfeil "==>", ja man könnte sogar die Dateiendung inklusive Punkt mitten rein schreiben. Auch die einfachen Anführungszeichen, Semikolon, und $, +, -, &, usw. können darin vorkommen, was die Suche möglicherweise erschwert.
Auf der Positiv-Seite sind die Doppelpunkte zu erwähnen, die definitiv nicht in Dateipfaden/namen vorkommen können und die beiden doppelten Anführungszeichen, die den jeweiligen Pfad umschließen. Also gute Suchkriterien.
Mein erster Gedanke war, StringDies, StringDas. ... Mein zweiter war RegExp, nach dem Motto, investiere jetzt ein bisschen Einarbeitungszeit, dann hast du nachher eine solide Routine, und kannst dein Wissen auch bei anderen Aufgaben einsetzen. Über 2 Stunden habe ich verschiedene Quellen zu RegExp durchgelesen und ausprobiert, unter anderem das Tutorial von SEuBo. Dann plötzlich hatte ich den vollen Durchblick: Das wird nie was! Meine Erinnerungen kamen wieder und mir wurde klar, dass RegExp's definitiv nicht das gleiche sind, wie Suchstrings mit WildCards.
Leider habe ich keine Funktion gefunden, bei der mit WildCards gesucht werden kann. StringInStr($sLine, '.au3"(*,*) : error: ') funktioniert nicht.
Nach den vielen Infos und Tutorials habe ich dann mithilfe einer Website zum Testen von RegExp's folgendes geschafft:
(?i)(\"*\.au3\"\(\d{1,},\d{1,}\) : Warning: )
oder
(?i)\.au3\"\(\d+,\d+\) : Warning:
Beide funktionieren für error und warning. Für den Pfeil "==>" habe ich es nicht geschafft, eine RegExp zu erstellen. Vielleicht kann das ja ein RegExp-erte? Außerdem müssten noch 0 oder 1 Leerzeichen vor die Klammer mit dem Zahlenwert hinzugefügt werden.
Damit könnte man die Fehlerzeilen (wahrscheinlich) zuverlässig erkennen. Danach mit _StringBetween() den Dateipfad auslesen und mit StringLeft-Mid-Right... den Zahlen-Teil ermitteln, noch ein paar Routinen zusammenklöppeln, um den "einsamen" Zahlenwert ein Komma und einen zweiten Zahlenwert zu spendieren, ins Log zurückschreiben und fertig. (Nach meiner Schlappe mit StringRegExp wollte ich StringRegExpReplace nicht mehr ergründen.)
Wie würdet ihr an die Sache herangehen?