@crlf umwandeln in echten Zeilenumbruch, in Analogie @tab etc.

  • Hallo Freunde der automatisierten Schritte,

    schreibe ich in Autoit

    $Zeile = "Das ist ein Test." & @CRLF & @TAB & "Weiter geht es."
    ClipPut ($Text)

    so erhalte ich in der Zwischenablage einen Text mit Zeilenumbruch und Tab.


    Wenn ich die gleiche Zeile aus einer ini-Datei auslese, also mit:
    $Zeile = IniRead ($ini_Datei, $ini_Section, $Schluessel, "")

    erhalte ich ebenfalls:

    "Das ist ein Test." & @CRLF & @TAB & "Weiter geht es."

    und mit dem Befehl

    ClipPut ($Text)

    weiterverarbeite, habe ich nur die reine Textzeile in der Zwischenablage (ohne aufgelöstes Enter, ohne Tab etc.).

    Was muss ich tun, damit die Zeile als Autoit-Befehl aufgelöst wird, also @CRLF zum Zeilenumbruch wird, @Tab zum Tab etc.?

    Viele Grüße
    AutoMit

  • Das eine ist AutoIt-Code der vom AutoIt-Interpreter ausgeführt wird, das andere ist ein String welcher AutoIt-Code enthält.
    Für AutoIt ist es aber weiterhin nur eine Ansammlung von Zeichen - nicht mehr.
    Du musst dem Interpreter sagen, dass es den String als AutoIt-Code ausführen soll:

    AutoIt
    $s_Au3String = '"Das ist ein Test." & @CRLF & @TAB & "Weiter geht es." & @CRLF'
    ConsoleWrite(Execute($s_Au3String))
  • Ich würde davon abraten hier Execute zu verwenden. INI Dateien sind beliebig editierbar, dadurch kann man alles mögliche durch einfaches Editieren der INI Datei zur Ausführung bringen.
    Die bessere Lösung wäre hier mit stringreplace() zu arbeiten.

    AutoIt
    $Zeile = IniRead ($ini_Datei, $ini_Section, $Schluessel, "")
    $Zeile = stringreplace($Zeile,"@CRLF",@CRLF)
    $Zeile = stringreplace($Zeile,"@TAB",@TAB)
    ; usw.
  • Misterspeed: Da machst du es dir aus Sicherheitsgründen meines Erachtens viel zu restriktiv...

    Folgende Funktion macht das gleiche wie "Execute" lässt dabei aber nur Strings und AutoIt-Makros zu.

    Natürlich ist die Funktion noch nicht zu 100% funktional (kleinere Probleme hat sie noch...), aber sie beseitigt schon mal die meisten Versuche, die man darauf loslässt. ;)

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Unsinn. Es ist einfach gefährlich Usercontent zur direkten Ausführung zu bringen. Sowas macht man einfach nicht, dann braucht man auch keine 20 Zeilen Code um den Usercontent halbwegs sicher zu filtern. Hier ging es lediglich darum bestimmte Steuerzeichen wie Tabulator oder Zeilenumbruch rückzuübersetzen, da es in ini Dateien Restriktionen diesbezüglich gibt.

  • misterspeed:

    Betrachten wir deinen Code. Er funktioniert wie eine gut konfigurierte Firewall: Alles was durch darf, muss explizit erlaubt werden. Ergo: Immer wenn ein neues Makro erlaubt werden soll, welches ebenfalls ersetzt werden soll, muss man bei dir nicht nur wieder eine neue Zeile hinzufügen, sondern auch das ganze Programm neu kompilieren und wieder neu verteilen. Und - der größte Nachteil: Es ist ein Ansatz, der nur auf dieses eine Problem passt - und selbst da nur solange die Anforderungen sich um keinen Millimeter verändern. Die simple Lösung in allen Ehren, aber hier wird am falschen Ende gespart. Denn bei der Aufgabe wird in 95% der Fälle immer der Funktionsumfang erweitert aka "Ach, wenn mer scho ma dabei sin, ne...".

    Meine Lösung unterstützt etwa 100 AutoIt-Makros bereits "von Haus aus". Ich finde dafür sind 11 Zeilen Code nicht zu viel (11+3 Zeilen Fragmentation = 14 Zeilen). Sie ist einfach deutlich flexibler und bietet die gleiche Scheinsicherheit wie dein Ansatz. Er erfordert schlicht deutlich weniger "Wartung" im Verlauf der Programmentwicklung. Daher rate ich zu der Methode, statt einer, die über alle Maßen restriktiv ist und dafür keinerlei Vorteile mitbringt außer dass sie äußerst kurzsichtig mal Arbeit gespart hat.

    Für ausführlichere Erklärungen, warum mein Code in vielen Punkten zielführender ist, als deiner, obwohl beide die gleiche Aufgabe mit 100% der Punktzahl abschließen, kannst du dem Buch "Weniger schlecht Programmieren" entnehmen. Eine Empfehlung für alle die gerne Programmieren. Mal in Stichworten: Fragmentierung (möglicherweise wiederkehrende Programmteile in Funktionen auslagern), Sprache (immer Englisch... du merkst doch selbst, dass es auf deutsch nicht funktioniert, wenn du dir alleine "Schlüssel" anguckst), Universalität (deine Lösung passt auf genau EIN Problem. Bedeutet: Auch wenn du ähnliche Anforderungen hast, musst du komplett neu anfangen), Notation (auch in AutoIt hat sich die ungarische Notation durchgesetzt. Mit ihr gibt man unter anderem an, was man erwartet in der Variable zu speichern...), Formatierung (in deinem Falle: Nicht konsequent und zudem noch zutiefst unübersichtlich...), usw.

    Damit du mich nicht falsch verstehst: Dein Code ist richtig und führt zur Lösung. Vermutlich sogar Sekundenbruchteile schneller als meiner. Er folgt schlicht keinem Standard der professionellen Programmentwicklung. Das muss nicht unbedingt schlecht sein, aber solltest du planen in dieser Richtung tätig zu werden, solltest du dich schnell an die Standards gewöhnen, da du es dir sonst nur unglaublich schwer machst. Zum Thema der Sprache merke ich nur eines an:

    AutoIt
    $zovut = "Iosif"  ;Как тебя зовут


    Ich denke das sagt alles.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • warum mein Code in vielen Punkten zielführender ist, als deiner, obwohl beide die gleiche Aufgabe mit 100% der Punktzahl abschließen

    Nicht ganz.
    Bei misterspeed wird AutoIt-Codeausführung über Stringinputs komplett unterbunden - bei dir ist es weiterhin problemlos möglich.
    Z.B.:

    AutoIt
    $s_Au3String = '"" + FileDelete(@ScriptDir)'
  • Macht zwar keinen Sinn hier Diskussionen anzufangen und hat auch nix mehr mit dem Thema zutun, aber da mir gerade langweillig ist zwei, drei Anmerkungen zu deinem Roman...

    Ich habe die Variablenbezeichnungen 1:1 aus dem Beispiel des Threaderstellers übernommen. Ich kenne durchaus die ungarische Notation und dessen Sinn, wobei wir hier von Autoit reden und dank des lieben Variant Datentyps... naja lassen wir das... ich selbst nutze in meinen Scripten ebenfalls die ungarische Notation und in der Regel auch die englische Sprache. Sei also beruhigt.

    Was du bei 4 Beispielcodezeilen an der Formatierung auszusetzen hast erschließt sich mir auch nicht, da gab es schlicht und einfach nichts zu formatieren.

    Du brauchst mir auch nicht erzählen was Funktionen sind und wie man diese sinnvollerweise gestalten sollte. Ich bin ausgebildeter Informatiker, programmiere auch nicht erst seit gestern und habe jedemenge Fachwissen über Software Design, auch wenn ich mich beruflich entschieden habe Administrator statt Programmierer zu werden.

    Ich kritisiere nicht deine Funktion, welche in der Tat sehr vieles abdeckt, sondern die Tatsache, dass du beliebigen veränderbaren Text als Autoit Code interpretierst (hoffentlich wirklich nur Strings und harmlose Makros) obwohl das hier in der konkreten Augabenstellung überhaupt nicht notwendig ist. Ohne dein Buch über "gutes" Programmieren gelesen zu haben (Korrektur es geht ja nur um "weniger schlechtes" Programmieren) kann ich mir beim besten Willen nicht vorstellen, dass dir jemand soetwas ernsthaft empfehlen würde wenn es nicht zwingend notwendig wäre oder aufgrund der Augabenstellung Sinn macht.

    Nun zu deinen 11 Zeilen und 100 Makros:


    Eine wunderschöne flexible Funktion um multiple Sonderzeichen aus Texten zu entfernen oder zu ersetzen, welche man auch hier im konkreten Beispiel anwenden/gebrauchen könnte.
    Achja und kritisier mich jezt nicht für fehlendes Errorhandling oder die tausend anderen Dinge die man daran verbessern/erweitern könnte. Das hier dient lediglich als Beispiel und ist keine saubere ausprogrammierte Funktion. Darum geht es hier im Forum auch nicht, sondern um Hilfe zur Selbsthilfe. ;)

    3 Mal editiert, zuletzt von misterspeed (26. Januar 2016 um 23:04)

  • @Aspirin: Ja, das ist momentan noch der anfällige Punkt - siehe oben. Beides erfüllt dennoch die hier gestellte Aufgabe zu 100%.

    misterspeed: Deine Anmerkungen zum Buch ignoriere ich, weil du nicht weißt wovon es handelt. Deine zuletzt veröffentlichte Version zum Beispiel ist deutlich besser als die letzte.

    Und nun: Diskussion Ende? Mir geht es darum diese Standards auch bei Hilfestellungen soweit möglich einzuhalten. :theke:

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Beides erfüllt dennoch die hier gestellte Aufgabe zu 100%.

    Welche Aufgabe?
    Die erste Aufgabe war Strings mit AutoIt-formatierten Zeilenumbrüchen in normale Strings zu wandeln.
    Das kann deine Funktion als auch Execute.

    Diese Aufgabe erweiterte misterspeed dahingehend, dass die erste erfüllt werden soll ohne von außen Codeausführungen zu ermöglichen.
    Diese Aufgabe erfüllen weder die Execute-Variante noch deine Funktion.

    Kurz: Welchen Mehrwert gegenüber Execute bietet deine Lösung?

    Einmal editiert, zuletzt von AspirinJunkie (27. Januar 2016 um 06:56)

  • Eine dicke Friedenspfeie rumreichend.


    Ich habe mich sehr über Eure Lösungen gefreut. Und die beiden am Anfang stehende nutze ich gerne - sie funktionieren.


    Wer auf (m)einem Rechner eine ini-Datei manipulieren kann, der kann noch ganz andere Dinge tun.

    Ich bewundere Eure Energie. Hey :) , ich habe noch ein paar andere Threads zu laufen, wie z.B.

    letztes Fenster aktivieren

    und

    Zwischenablage Formatierung speichern mit Autoit

    Eine Spielwiese mit reichlich Platz für Euer Fachwissen :)
    Dort ist nach dem bisherigen Verlauf echtes Profiwissen gefragt.

    Hier sind alle Probleme gelöst seit Post 4.

    Eine dicke Friedenspfeie rumreichend.


    PS: grüner Haken neben dem Thread :)

    2 Mal editiert, zuletzt von AutoMit (29. Januar 2016 um 18:53)

  • Wer auf (m)einem Rechner eine ini-Datei manipulieren kann, der kann noch ganz andere Dinge tun.

    Es geht hier nicht nur um böswillige Manipulationen durch Dritte. Wenn du dich beim editieren der INI Datei vertippst führt das bei Nutzung von execute() zum Programmabsturz mit einer Fehlermeldung die du wenn ich mir deine anderen Themen ansehe mit Sicherheit nicht verstehen und zuordnen können wirst. Wer schonmal stundenlang nach einer Fehlerursache gesucht hat, weil ihm ein böser Tippfehler unterlaufen ist der in seltenen Fällen zum Programmabsturz führt wird verstehen wovon ich rede. Sowas passiert dir mit der von mir beschriebenen Lösung jedenfalls nicht.


    Dort ist nach dem bisherigen Verlauf echtes Profiwissen gefragt.

    Wenn man Neuling ist sollte man etwas mehr zurückhaltend mit solchen Aussagen sein. Dir wurde in beiden verlinkten Themen von sehr erfahrenen Forenmitgliedern ausreichend Hilfestellung gegeben. Wenn du nicht bereit bis dich tiefergehend mit Autoit bzw. dem systematischen Vorgehen beim Programmieren und Erlernen einer Programmiersprache zu beschäftigen bist du hier schlichtweg falsch. Das klingt vielleicht hart aber es ist so. Du lernst absolut garnichts wenn man dir jede Kleinigkeit vorkaut und wirst uns auch in Zukunft weiterhin mit Fragen bombardieren wenn du nicht anfängst etwas mehr Eigeninitiative zu ergreifen.

  • Heute ist echt der Wurm drin. Ich möchte doch nur eine zielführende Lösung zum Thema, und nicht dauernd in neue Diskussionen verstrickt werden.

    (ich weiß leider nicht, wie ich nachträglich ein Zitat von Beitrag 14 hier einfügen kann)

    Zum Thema Execute. Ich kann mich in der ini-Datei nicht vertippen, da in die ini-Datei nichts per Hand an Autoit-Programmcode geschrieben wird. @misterspeed - Du hast eine sehr interessante Lösung zu diesem Thread in 4 geschrieben.

    Zum Thema Fachwissen:

    "Bugfix schreibt in Post 13 zum Thema Zwischenablage"

    "Doch, die Frage ist erlaubt und das Rad muss nicht neu erfunden werden, wenn das jemand vorher getan hat. Der Punkt ist eher, dass das Arbeiten mit der Zwischenablage weder
    häufig noch trivial ist und somit kaum jemand ein "Gerüst" rumstehen
    hat."

    Und dann glaubst Du, dass ich als Anfänger das schreiben kann? Nein, ich kann das nicht. Und keiner, der bisher geantwortet hat, hat was in der Schublade oder kann es auf die Schnelle schreiben.

    "Dort ist nach dem bisherigen Verlauf echtes Profiwissen gefragt."

    Und genau daher bin ich der Auffassung, dass dort "echtes Profiwissen" gefragt ist und zwar themenspezifisches Profiwissen. Einer kennt sich gut mit Grafik, der andere mit FTP etc. aus. Hier ist spezielles Wissen zum Thema Windows API und Zwischenablage gefragt. Und (Zitat Bugfix) es nicht "trival".

    Bitte, was ist an meinen vorherigen Zeilen schon wieder falsch (völlig entnervt).

    Stichwort „bombardieren“ – ich reduziere mein Engagement gerne auf x Fragen pro Monat – welche Zahl ist o. k.?

    Hier ist das Forum "Hilfe und Unterstützung".

    Ein Beispiel aus dem Leben:

    Ziel: ich möchte eine Banane kaufen. Der Laden ist 10 km entfernt. Du bist freundlich und sagst, hey, ich leihe Dir meinen Audi. Super - nur ich habe keine Fahrerlaubnis. Klar kann ich jetzt die Fahrschule besuchen. Und wenn ich dann meinen Führerschein habe, kann ich endlich die Banane kaufen.

    Sieht Hilfe wirklich so aus?

    Ich erwarte nicht, dass es auf jede Frage eine Lösung gibt. Und wer zur Lösung beitragen will - super - ich freue mich.

    Aber es muss mir als Threadstarter doch erlaubt sein, einzuschätzen, ob das eine Hilfe war - dann setze ich einen grünen Haken und bedanke mich. Oder ob es keine Hilfe war, dann muss ich das offen sagen dürfen. Und zwar ohne, dass mir Experten, Profis, Wissende ... erklären, dass ich die Hilfe-Datei benutzen soll, dass ich mehr Stunden lesen soll, dass ich noch mehr Stunden lesen soll, dass ich mich tiefer in die Materie einarbeiten soll ... men Gott, es geht um Hilfe und Unterstützung. Wenn ich sowas lese, ist das wie ein Schlag ins Gesicht. Stunden- und tagelang versuche ich ein Problem zu lösen (ja, ich befasse ich streckenweise sehr intensiv mit Autoit), stelle gebündelt einige Fragen aus den vorangegangenen Tage, und dann lese ich sowas wie "mehr lesen, Hilfe benutzen" ...

    Klar kann ich mir auch eine Schmiede kaufen, erlernen, wie ich einen Hammer schmiede, um dann den Nagel in die Wand zu schlagen. Oder ich frage, wer so freundlich ist, mir seinen Hammer zu leihen. Ich habe eine Säge im Werkzeugkasten. Hey - die leihe ich gerne, wenn sie jemand braucht.

    Bestimmte Funktionen nutzt man nur selten und Zwischenablage und Windows API letztes Fenster wird einmal programmiert und dann nie wieder angegangen.

    Es geht bei einem Thema, was ich eröffne, um eine Hilfe und Unterstützung für mich - also für den Threadstarter. Oder sehe ich das falsch?

    Können wir Diskussionen einstellen und uns auf Lösungen konzentrieren?

    Können wir aufhören zu entscheiden, ob etwas für den Threadersteller eine Lösung ist oder nicht? Der einzige, der das beurteilen kann und beurteilen darf, ist nunmal der Threadstarter.

    Um auf die Banane zurückzukommen. Wenn Du im obg. Beispiel ohne Auto aber mit Fahrerlaubnis einkaufen fahren wolltest, wäre für Dich der geliehene Audi eine Lösung. Für mich nicht. Leute, ihr kennt doch gar nicht alle Faktoren, etc. - warum wird hier so oft geurteilt, verurteilt etc. anstatt zu helfen? Ich habe hier über die Wochen hunderte Beiträge gelesen und immer wieder wird über den Threadstarter geurteilt, er hätte doch die Hilfe lesen können, er hätte doch ...

    Eine Hilfe sähe im Bananen-Beispiel so aus:

    + ich habe ein paar Minuten Zeit und fahre Dich hin ... oder
    + in einer Stunde fährt ein Bus ... oder
    + in der Nähe gibt es noch einen Tante Emma Laden, nur 5 Minuten entfernt, hier die Wegbeschreibung ... oder
    + ich fahre heute ohnehin einkaufen und bringe Dir eine Banane mit ... oder
    + heute kommt gegen 17 Uhr ein "Laden auf Räder", der hat bestimmt Bananen.


    Freut Euch doch, dass Ihr - die sowas beurteilt - dazu in der Lage seit, die Hilfe so zu benutzen, Englisch zu können, ein umfangreiches Handwerkzeug besitzt, Jahre lang Erfahrungen habt, etc. ... und denkt in aller Stille mal zurück, wie oft Ihr Hilfe von anderen erhalten habt. Hilfe - ohne Vorhaltungen, ohne Urteile und Verurteilungen, ohne Anfeindungen, ohne nervenaufreibendes Ping Pong, ohne Diskussionen ... einfach Hilfe.

    Bitte Leute - lasst uns unsere Energie in die Lösung von Fragen stecken. Bitte.

    ...

    13 Mal editiert, zuletzt von AutoMit (29. Januar 2016 um 20:46)