UDF Dateiname / Suche austricksen

  • Hallo Freunde der automatisierten Schritte,

    (1)

    vorab kurz gefragt - wie kann ich die Forums-Suche austricksen?

    "Nur Betreff durchsuchen ... Ein Begriff muss mindestens vier Zeichen lang sein."

    Wie kann ich dann nach UDF im Betreff suchen?

    (2)

    Wie kann ich die Funktion in der UDF schreiben, damit beim Funktionsaufruf in einem Script in der Console,
    (1) der Dateiname der UDF-Datei und
    (2) der Dateipfad der UDF-Datei (nicht Standardpfad)
    ausgegeben wird?

    Ich erhalte den Dateinamen des Scripts (nicht der UDF). Erstaunlicherweise funktioniert es mit der Zeilennummer richtig.

    AutoIt
    ; test.au3
    #include <udf.au3>
    ConsoleWrite (@ScriptLineNumber & " (Script - Zeilennummer) "  & @TAB & @ScriptName & " = Scriptname" & @CRLF)
    _test_()
    AutoIt
    ; test.udf
    
    
    Func _test_()
    	ConsoleWrite (@ScriptLineNumber & " (UDF - Zeilennnummer)" & @TAB & @ScriptName & " = UDF-Dateiname (ist aber der Scriptname, der die UDF aufgerufen hat, wie erhalte ich den UDF-Dateinamen? und ggf. auch den UDF-Pfad ... nicht der Standardpfad)" & @CRLF)
    EndFunc


    Viele Grüße und vielen Dank :)
    AutoMit

    • Offizieller Beitrag

    Zu 1)
    Vergiss die Forensuche - die ist leider suboptimal, wie man richtig mit Google sucht hatte ich dir letztens erst gezeigt.

    Zu 2)
    ????? - Wozu willst du den Pfad einer Datei abfragen, die du selbst einbindest? - Öffnen kannst du sie in SciTE mit: Cursor auf #include und dann Alt+I

  • zu (1)
    wenn es einen Weg gibt, das mit der Forensuche zu tun, ist mir das lieber, vielleicht kennt jemand eine Lösung für die Forensuche (nicht Google, sonst hätte ich nach Google gefragt ;) )
    Vielleicht erbarmt sich der Forenbetreiber und setzt die Mindestanzahl auf drei Zeichen, damit man im Titel auch Sachen findet wie UDF, gui etc.).

    zu (2)

    Als Debug-Info.

    Ich schreibe unter einen Aufruf ein consolewrite, um zu sehen, aus welcher Zeile und Datei die ausgeführte Scriptzeile stammt.
    Wenn man mit mehreren eigenen UDFs arbeitet, wie soll man zuordnen, aus welcher Programmzeile und welcher au3 die Debug-Info stammt? Dazu brauche ich neben der Zeilennummer auch den Dateinamen, aus dem die Zeile stammt.
    Aber das nur nebenbei.

    Interessanter - und zielführender - ist, wie ich das erreichen kann.

    Nebenziel - warum wird die Zeilennummer richtig angezeigt, aber der Dateiname nicht?

    Hast Du mal das Script ausgeführt?

    Einmal editiert, zuletzt von AutoMit (11. Februar 2016 um 16:59)

    • Offizieller Beitrag

    Wenn man mit mehreren eigenen UDFs arbeitet, wie soll man zuordnen, aus welcher Programmzeile und welcher au3 die Debug-Info stammt?

    Indem man diese Info in die Debugzeile mit einfügt?! ConsoleWrite('Dateiname ' & 'was-du-willst' & @LF)

    Nebenziel - warum wird die Zeilennummer richtig angezeigt, aber der Dateiname nicht?

    Weil es für Zeilennummer ein Makro gibt. Das Makro @Scriptname gibt den Namen deines Skriptes wieder. Evtl. eingebundene andere Skripte sind während der Laufzeit in dieses eingebunden. Es gibt also nur 1 Datei und deren Name gibt @Scriptname wieder.

  • zu (1)
    wenn es einen Weg gibt, das mit der Forensuche zu tun, ist mir das lieber, vielleicht kennt jemand eine Lösung für die Forensuche (nicht Google, sonst hätte ich nach Google gefragt )
    Vielleicht erbarmt sich der Forenbetreiber und setzt die Mindestanzahl auf drei Zeichen, damit man im Titel auch Sachen findet wie UDF, gui etc.).

    Darauf wirst du lange warten können. Es hat einen Grund warum man die Mindestanzahl an Zeichen höher angesetzt hat. Je niedriger die Zeichenanzahl, desto umfangreicher wird die Ergebnismenge und somit die Last der Datenbankabfrage. Das könnte man z.B. für eine DOS Attacke ausnutzen. Wenn man google richtig nutzt kann man problemlos jeden relevanten Beitrag hier im Forum finden. Aber google magst du ja scheinbar nicht... warum auch immer.

  • Normal wird in UDFs nicht Debuged. Die Funktionieren, wenn sie veröffentlicht werden (normalerweise). Deshalb ist dort zu debuggen der falsche Weg.
    Du weißt ja, was dort passieren soll. Also debugged man vor und nach dem Aufruf der Funktion aus der UDF, um zu sehen, ob es funktioniert.


    Es sind eigene geschriebene UDFs und die funktionieren natürlich nicht von Anfang an. Aber darum geht es nicht.

    Freunde, können wir uns nicht auf das Ziel konzentrieren?

    Ich möchte doch nur neben der richtig ausgegebenen
    @ScriptLineNumberauch den zugehörigen Dateinamen.

    Wundert es Euch nicht, dass die Zeilennummer richtig über die Funktion in die Console geschrieben wird (Zeilennummer der Funktion in der UDF), der Dateiname jedoch nicht stimmt?

    Probiert doch mal obiges Script aus.

    Entweder müssen Zeilennummer und Dateiname aus der UDF oder aus der test.au3 stammen.

    Ein Mischmasch ist unlogisch.

    • Offizieller Beitrag

    Wundert es Euch nicht, dass die Zeilennummer richtig über die Funktion in die Console geschrieben wird (Zeilennummer der Funktion in der UDF), der Dateiname jedoch nicht stimmt?

    DER DATEINAME STIMMT! Wie oft denn noch: Es gibt nur EINE Datei: das startende Skript. Andere Dateien, die per #Include eingebunden sind, sind zur Laufzeit des Skriptes ein Bestandteil davon, so als ob man deren Inhalt einfach in dein Skript einfügt.


  • Wie oft denn noch:


    Wie oft denn noch ... ich möchte in obiger Konstrution - wie auch immer - folgende Ausgabe:


    5 (Script - Zeilennummer) test.au3
    9 (UDF - Zeilennnummer) udf.au3

    und nicht

    5 (Script - Zeilennummer) test.au3
    9 (UDF - Zeilennnummer) test.au3

    Warum ist es bloß so schwer, zielführende Antworten zu erhalten?

    In Beitrag 1 von mir steht:

    "Wie kann ich die Funktion in der UDF schreiben, damit beim Funktionsaufruf in einem Script in der Console,
    (1) der Dateiname der UDF-Datei" ... steht?

    Es mag ja interessant sein, dass die Variablen richtig aufgelöst werden, dass ich mich über den Inhalt der Variablen im Unklaren befinde, dass es nur eine Datei ist etc.

    Aber das beantwortet nicht meine Fragestellung. Es führt nicht zum Ziel.

    Freunde, Ihr programmiert - Ihr denkt logisch - warum wird dann in den Themen ständig diskutiert,
    statt eine zielführende Antwort zu geben?

    Auf eine Frage, wie ein Ziel erreicht werden kann, erhofft sich der Fragesteller eine zielführende Antwort.

    Ihr habt hier Scripts veröffentlicht, da kommt man aus dem Staunen nicht heraus.

    Und dann kann nicht mal der Dateiname einer UDF in obigem Beispiel wiedergegeben werden?

    Mag sein, dass es nicht geht, aber dann bitte keine Diskussionen.

    Bitte lasst uns mehr zielführend arbeiten.

  • Es gibt keine Möglichkeit, den Dateinamen der benutzten UDF anzugeben (zumindest keine, für die man sich nicht selbst nen Script schreiben müsste.)
    Das liegt ganz einfach daran, dass der Compiler den Quellcode der Datei an die Stelle des #include <...> setzt. Genauso, wie BugFix es erklärt hat...

    Es hat sich noch nie jemand die Mühe gemacht, das umzusetzen, weil man es einfach nicht braucht. Wenn man die UDFs nicht kennt, die man benutzt, oder die Stellen nicht versteht, wo/wie sie benutzt werden, dann sollte man sie auch nicht benutzen.

    Was wir dir alle erklären möchten: Du kannst nicht irgendwelche UDFs nutzen, ohne zu verstehen, was sie machen, bzw. wie sie funktionieren. Man bringt auch niemandem Japanisch bei, indem man demjenigen einen fertigen Text gibt und den übersetzt. Man muss die Grundlagen (Grammatik,Vokabeln,...) können, damit es funktioniert. Deshalb findest du auch fast nur Diskussionen in deinen Threads. Du sagst uns praktisch: Übersetz mal diesen Abschnitt. Dadurch verstehst dus aber nicht vernünftig und wir dürfen alle ewig Abschnitte übersetzen.

    Such dir EIN Projekt, mit dem du anfangen möchtest, setz das um. Wenn es an manchen Stellen hapert, kannst du gerne hier Fragen. Das Projekt solte deinem aktuellen Stand wiederspiegeln und nur geringfügig neue Sachen vorraussetzen.

    Ich denke mal, ich spreche für alle, wenn ich sage, das jeder so anfängt. Mein erstes Script war ne Gui als Taschenrechner. Dann geht man weiter und sucht sich etwas, das ein bisschen schwerer ist.
    Niemand, der eine Sprache lernen will, sucht sich schwere Scripte raus und lässt sich die erklären.
    Wie will man auch das schwere verstehen, wenn die einfacheren Dinge fehlen.
    Gerade, dass du mehrere Projekte gleichzeitig umsetzen willst ist eine schlechte Idee. Das ständige wechseln ist nicht gerade gut zum lernen. Man denkt sich in das eine rein, denkt dann über das andere nach und ist aus dem andern wieder raus.

    Ich hoffe, du weißt, dass ich es nicht böse meine, aber ich glaube, deine Lernmethode ist leider die Falsche.

    MfG Kanashius

    • Offizieller Beitrag

    Warum ist es bloß so schwer, zielführende Antworten zu erhalten?

    Warum ist es so schwer, Fragen zu stellen, die die tatsächlichen Gegebenheiten berücksichtigen statt eines Wunschdenkens?
    Auch nicht bös gemeint. Aber du verweigerst dich permanent unseren Antworten, wie ein Kind, das sagt: Ich will, ich will, ich will.

  • Weil es für Zeilennummer ein Makro gibt. Das Makro @Scriptname gibt den Namen deines Skriptes wieder. Evtl. eingebundene andere Skripte sind während der Laufzeit in dieses eingebunden. Es gibt also nur 1 Datei und deren Name gibt @Scriptname wieder.


    Es gibt nur 1 Datei - gehen wir davon aus. Die UDF wird includiert.

    test.au3

    6. Zeile -> ConsoleWrite (@ScriptLineNumber)
    7. Zeile ->_test_() (UDF - sehr viele Leerzeilen, dann ein einfaches ConsoleWrite (@ScriptLineNumber))
    8. Zeile ->ConsoleWrite (@ScriptLineNumber)

    Warum dann folgendes Ergebnis?

    6 (Script - Zeilennummer)
    64 (UDF - Zeilennnummer)
    8 (Script - Zeilennummer)

    Wenn es eine Datei ist, wie kann dann bei 3 aufeianderfolgenden Zeilen in der test.au3 dieses Ergebnis kommen, wenn die udf nicht doch als extra Datei behandelt wird und die Zeilennummer eben auf die UDF verweist?

    Wenn aber die Variable @ScriptLineNumber sich auf die UDF bezieht, obwohl es angeblich nur 1 Datei ist (au3 mit inkludierter UDF), darf dieser Zeilensprung nicht ausgegeben werden.

    Meiner Meinung nach ist @Scriptname einfach buggy programmiert.


    @ScriptLineNumber bezieht sich wirklich auf die Zeilennummer jener Datei, in der es steht.
    @ScriptName bezieht sich leider nicht auf die Datei, in der es steht, sondern nur auf die Start.au3

    5 Mal editiert, zuletzt von AutoMit (12. Februar 2016 um 17:28)

    • Offizieller Beitrag

    Warum dann nicht auch ein Script, was die Fragestellung aus Post 1 löst.

    Wenn du möchtest, schreib es dir. Dafür siehst aber nur du einen Bedarf.
    Die Fragestellung ergibt sich nämlich aus den bereits mehrfach geschilderten Gründen im Normalfall nicht. Ausnahme: Du verwendest eine UDF, die den Namen nicht verdient und bis über beide Ohren verbugt ist.
    Kopiere doch den Inhalt der Dateien mit in dein Skript, statt zu includen. Nicht schick, aber dann hast du eine direkte Zuordnung beim Debug.

  • Schreib in deine UDF einfach rein: $udf_Scriptname="udf.au3"
    und in dem ConsoleWrite: $udf_Scriptname anstatt @Scriptname.
    (Ersetze udf mit dem Namen der UDF. Sonst kommts bei mehreren UDFs zu namenskonflikten).

    Dafür nen Script zu schreiben lohnt sich nicht. Es ist 1. Zu schwer für dich, 2. Zeitaufwändig, 3. Muss man vermutlich den Compiler umschreiben, was zusätzlich noch illegal wäre. Außerdem auch noch extrem schwer.
    Hätte ich jetzt so auf die schnelle keinen Ansatz für.
    4. Seh ich keinen nutzen darin, da es (außer dir) niemand braucht/benutzen würde, weil es wie bereits mehrfach erwähnt unnötig ist.

  • Danke Freunde - ich akzeptiere Eure Entscheidung.

    Vielleicht mag mir jemand noch Post 12 erklären.

    Ich setze das Thema dennoch schon mal auf erledigt.

    PS: Kanashius, dank Deiner Zeilen fiel mir eine einfache Lösung ein. Ich lege den Namen in die Zwischenablage (speichert 100 Einträge) - das reicht für die Debugzwecke und ist automatisiert.