1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Purzel Hägar

Beiträge von Purzel Hägar

  • Seltsames Verhalten mit Return

    • Purzel Hägar
    • 10. Januar 2022 um 08:53

    Hallo an euch alle!

    Danke für eure Geduld und dass ihr mir versucht habt, das Problem zu erklären. Ich nehme mit "Finger weg vor Rekursion" - und scheinbar bin ich da einem ganz grundlegenden Denkfehler unterlegen und werde das bei mir "aufräumen". Ganz besonderen Dank nochmals an Oscar, dessen Tipp mir letztlich weitergeholfen hat.

    Viele Grüße :)

  • Seltsames Verhalten mit Return

    • Purzel Hägar
    • 9. Januar 2022 um 18:59
    Zitat von Oscar

    Hier wird doch ein Funktionsaufruf als GoTo missbraucht, was zu einem rekursiven Funktionsaufruf führt (mit den entsprechenden Problemen).

    Bei Einsatz einer Schleife ist das aber gar nicht nötig:

    AutoIt
    #include <File.au3>
    #include <WinAPIInternals.au3>
    
    Global $targetPath ; wird im Original-Script ebenfalls an dieser Stelle deklariert
    
    _aufrufendeFunktion()
    
    Func _aufrufendeFunktion() ; _setTargetPath() wird so wie hier innerhalb des Scripts von einer weiteren Funktion aufgerufen
        $targetPath = _setTargetPath(0)   ; Als Rückgabewert wird entweder eine Pfadangabe oder "" erwartet
        ConsoleWrite(@CRLF & " Rueckgabewert nach RETURN: >>>" & $targetPath & "<<<" & @CRLF & @CRLF)
    EndFunc   ;==>_aufrufendeFunktion
    
    Func _setTargetPath($mode)
        While True
            Switch $mode
                Case 0 ; Aufruf beim Hinzufügen eines neuen Eintrages
                    Local $sNewPath = FileSelectFolder("Zielverzeichnis auswählen", $targetPath)
                    If $sNewPath = '' Then Return ''
                    If __validatePathAccess($sNewPath) Then Return $sNewPath
                Case 1 ; Aufruf beim Ändern eines oder meherer vorhandener Einträge
    
                Case Else ; Falscher Übergabeparameter $mode
                    Return ''
            EndSwitch
        WEnd
    EndFunc   ;==>_setTargetPath
    
    Func __validatePathAccess($path)
        If _WinAPI_PathIsDirectory($path) Then
            If StringRight($path, 1) = "\" Then $path = StringTrimRight($path, 1)
            Local $h_tempFile = FileOpen($path & "\DieseDateiSollteGeloeschtWerden.txt", $FO_OVERWRITE)
            If $h_tempFile <> -1 Then ; die erforderlichen Zugriffsrechte sind vorhanden
                FileClose($h_tempFile)
                FileDelete($path & "\DieseDateiSollteGeloeschtWerden.txt")
                Return True
            EndIf
        EndIf
        Return False ; es fehlen die erforderlichen Zugriffsrechte
    EndFunc   ;==>__validatePathAccess
    Alles anzeigen

    Hallo Oscar,

    ich habe zwar noch nicht das Problem verstanden, aber dein Ansatz scheint in auch in meinem Original-Script zu funktionieren. Dafür erst einmal meinen herzlichen Dank an dich.

    Könntest du mir bitte hierzu noch etwas mehr Info geben "... Funktionsaufruf als GoTo missbraucht, was zu einem rekursiven Funktionsaufruf führt (mit den entsprechenden Problemen)." - damit ich das Problem verstehen kann? Und wieso sich bei meinem Ansatz in dem Szenario Fall 2 immer die 0 "reingemogelt" hatte.

    Beste Grüße :)

  • Seltsames Verhalten mit Return

    • Purzel Hägar
    • 9. Januar 2022 um 18:34
    Zitat von BugFix

    Das ist auch völlig korrekt. Du rufst die Funktion aus sich selbst heraus auf. Dabei übernimmt dieser Aufruf aber keine bisherigen Werte. Es ist ein absolut frischer Aufruf.

    Möchtest du bis dahin erstellte Werte beim rekursiven Aufruf nutzen, übergib diese einfach in einem zusätzlichen optionalen Parameter (z.B. $newPath0_rec), den du mit Null vorbelegst.

    In der Funktion prüfst du dann bei Verwendung der Variablen $newPath0, ob $newPath0_rec <> Null ist und weist dann diesen Wert zu.

    Der treffendere Titel für dein Problem ist somit: Bei rekursivem Funktionsaufruf gehen bisher in der Funktion erstellte Werte verloren. ;)

    Da habe ich mich vermutlich unklar ausgedrückt. Selbstverständlich gehen hier die vorherigen Werte verloren, wenn die Funktion erneut aufgerufen wird. Das ich so auch gewollt.

    Das Problem ist, dass wenn die Funktion in dem beschriebenen Szenario (S. Fall 2) erneut aufgerufen wird IMMER DIE 0 zurückgegeben wird, obwohl die Variable $newPath0, die retuniert wird, eine Pfadangabe enthält. Dass ist mein Problem, zu dem ich keinen Lösungsansatz habe.

  • Seltsames Verhalten mit Return

    • Purzel Hägar
    • 8. Januar 2022 um 17:37

    Nochmals vielen Dank für eure Rückmeldungen. Ich habe den dasProblem betreffenden Teil aus meinem Script extrahiert. Das zuvor geschilderte Problem lässt sich damit exakt nachstellen. Alles weitere im Code.

    Ich bin echt gespannt, was ihr erkennt/herausfindet. Vielen Dank schon jetzt für jede Untertsützung.

    Spoiler anzeigen

    #include <WinAPIFiles.au3>
    ;
    ; HINWEISE
    ; Der nachstehende Aufbau/Ablauf entspricht prinzipiell dem meines Scriptes.
    ; Alle das Problem betreffenden Stellen sind nachstehend aufgeführt.
    ; Das (Problem-)Verhalten entspricht 1:1 dem Original.
    ; Das Programm wird unter Windows 10 x64 mit Standard-Benutzerrechten (NICHT Adminrechte) ausgeführt.
    ;
    ; TESTSZENARIEN (siehe auch Problembeschreibung im ElseIf-Zweig)
    ; Fall 1)
    ; Sript starten - ein Verzeichnis auswählen, in dem der Benutzer Schreibrechte hat > Der Rückgabewert
    ; vor und nach Return ist identisch.
    ;
    ; Fall 2)
    ; Script starten - ein Verzeichnis auswählen, in dem der Benutzer KEINE Schreibrecht hat - danach ein Verzeichnis
    ; auswählen, in dem der Benutzer Schreibrechte hat > Der Rückgabewert vor und nach Return sind unterschiedlich
    ;
    Local $targetPath ; wird im Original-Script ebenfalls an dieser Stelle deklariert

    _aufrufendeFunktion()

    Func _aufrufendeFunktion() ; _setTargetPath() wird so wie hier innerhalb des Scripts von einer weiteren Funktion aufgerufen
        $targetPath = _setTargetPath( 0 ) ; Als Rückgabewert wird entweder eine Pfadangabe oder "" erwartet
        ConsoleWrite( @CRLF & " Rueckgabewert nach RETURN: >>>" & $targetPath & "<<<" & @CRLF & @CRLF )
    EndFunc

    Func _setTargetPath( $mode )
        If StringIsInt( $mode ) And StringLen( $mode ) = 1 And StringRegExp( $mode, '[0-1]' ) Then ; Prüfung des Parameters

            If $mode = 0 Then ; Aufruf beim Hinzufügen eines neuen Eintrages
                Local $newPath0 = FileSelectFolder( "Zielverzeichnis auswählen", $targetPath )
                If $newPath0 = "" Then ; Es wurde KEIN ZIELPFAD ausgewählt
                    Return $newPath0
                ElseIf $newPath0 <> "" And __validatePathAccess( $newPath0 ) Then ; Es wurde ein KORREKTER ZIELPFAD ausgewählt
                    ConsoleWrite( @CRLF & " Rueckgabewert vor RETURN = >>>" & $newPath0 & "<<< (ElseIf-Zweig)" & @CRLF & @CRLF )
                    Return $newPath0
                             ; PROBLEM: Wenn _setTargetPath() erneut aufgerufen wird, nachdem die Funktion unmittelbar davor in
                             ; den Else-Zweig (Ungenügende Zugriffsrechte für das ausgewählte Verzeichnis) gesprungen ist,
                             ; dann wird der eigentliche Inhalt von $newPath0 als Rückgabewert ignoriert. Obwohl ein
                             ; korrektes Verzeichnis (Pfadangabe oder "") ausgewählt wurde und die betreffende Variable
                             ; $newPath0 unmittelbar vor dem RETURN den korrekten Wert ausgibt. Stattdessen wird eine 0 (Null)
                             ; zurückgegeben und in _aufrufendeFunktion() an $targetPath übergeben.
                             ; Dieses Verhalten gilt unabhängig davon, ob _setTargetPath() mit dem Parameter 0 oder 1 aufgerufen wird.
                Else ; Ungenügende Zugriffsrechte für das ausgewählte Verzeichnis
                    _setTargetPath( 0 ) ; Sollte das ausgewählte Verzeichnis nicht über die ausreichenden Zugriffsrechte
                                        ; verfügen (Schreibrechte), dann wird dem Benutzer die Verzeichnisauswahl erneut
                                        ; angeboten (durch erneuten Aufruf der Funktion), bis ein zulässiges Ergebnis (valide Pfadangabe
                                        ; oder ein leeren String) zurückgegeben werden kann.
                EndIf
            ElseIf $mode = 1 Then ; Aufruf beim Ändern eines oder meherer vorhandener Einträge
                ; Abweichende Programmlogik zu $mode = 0. Jedoch besteht das Problem mit dem falschen Rückgabewert auch hier,
                ; da diese Programmteile identisch zu $mode = 0 sind.
            EndIf
        Else
            ; Falscher Übergabeparameter $mode
        EndIf
    EndFunc ; ==> _setTargetPath( $mode )

    Func __validatePathAccess( $path )
        If _WinAPI_PathIsDirectory( $path ) Then
            If StringRight( $path, 1 ) = "\" Then $path = StringTrimRight( $path, 1 )
            Local $h_tempFile = FileOpen( $path & "\DieseDateiSollteGeloeschtWerden.txt", $FO_OVERWRITE )
            If $h_tempFile <> -1 Then ; die erforderlichen Zugriffsrechte sind vorhanden
                FileClose( $h_tempFile )
                FileDelete( $path & "\DieseDateiSollteGeloeschtWerden.txt" )
                Return True
            EndIf
        EndIf
        Return False ; es fehlen die erforderlichen Zugriffsrechte
    EndFunc ; == > __validatePathAccess( $path )

  • Seltsames Verhalten mit Return

    • Purzel Hägar
    • 4. Januar 2022 um 18:57

    Vielen lieben Dank an euch - für eure Zeit und den Input :thumbup: Ich seh schon, da muss ich erst noch meine Hausaufgaben erledigen. Zwischenzeitlich werde ich das Thema hier erst einmal still legen.

  • Seltsames Verhalten mit Return

    • Purzel Hägar
    • 30. Dezember 2021 um 19:58

    Hallo in die Runde.

    Ich bin auf ein für mich seltsames Phänomen gestoßen. Viele Stunden habe ich zwischenzeitlich damit verbracht, um herauszufinden, woher das Problem rührt. Ich weiß mir keinen Rat mehr und hoffe jemand von euch hat einen hilfreichen Gedanken hierzu.

    Da mein Script sehr umfangreich geworden ist und die relevanten Teile für das Problem nicht einfach herauskopiert werden können, will ich versuchen, den Sachverhalt so exakt wie möglich zu beschreiben.

    Innerhalb des Scripts ruft eine Funktion A eine weitere Funktion B auf. Der erwartete Rückgabewert von B an A soll in Abhängigkeit der in B auszuführenden Schritte entweder ein „“ (leerer String) oder eine Pfadangabe sein. Das funktioniert nach mehreren Testläufen genauso wie gedacht. Nur in einem speziellen Fall (s. u.), wird anstatt des Variableninhalts eine 0 (Null) zurückgegeben. Geprüft habe ich innerhalb von Funktion B:

    Code
    ConsoleWrite( "$newPath = >" & $newPath & "< Variableninhalt unmittelbar vor Return!!!" & @CRLF ) ; ergibt beispielsweise “D:\Temp”
    Return $newPath

    Die aufrufende Funktion A erhält jedoch eine 0, obwohl ich D:\Temp erwartet hätte. Ich habe keine Ahnung, woher diese 0 kommt und wie sie sich dazwischen zecken kann, um den korrekten Variablenwert (in dem Beispiel wäre das D:\Temp) zu ersetzen.

    Sonderfall, wo dieses Problem auftritt:

    In Funktion B wird der Rückgabewert der von hier aufgerufenen Funktion FileSelectFolder() dahingehend überprüft, ob es sich um ein a) Verzeichnis handelt (in diesem konkreten Beispiel sicher redundant) und b) ob der Anwender in diesem Verzeichnis Schreibrechte hat. Beide Prüfungen erfolgen in einer weiteren Funktion C (_validatePathAccessRights() siehe nachstehend), die von Funktion B aufgerufen wird.

    Code
    Func _validatePathAccessRights( $path )
    Local $attributes = FileGetAttrib( $path )
    If $attributes <> "" And @error = 0 Then
    If StringInStr( $attributes, "D" ) Then
    If StringRight( $path, 1 ) = "\" Then $path = StringTrimRight( $path, 1 )
    Local $h_tempFile = FileOpen( $path & "\DieseDateiSollteGeloeschtWerden.txt", $FO_OVERWRITE )
    If $h_tempFile <> -1 Then ; die erforderlichen Zugriffsrechte sind vorhanden
    FileClose( $h_tempFile )
    FileDelete( $h_tempFile )
    Return True
    Else
    SetError(3, 0, "Es fehlen die erforderlichen Schreib-Zugriffsrechte.")
    FileClose( $h_tempFile )
    FileDelete( $h_tempFile )
    EndIf
    Else
    SetError(2, 0, "Bei dem angegebenen Pfad handelt es sich um kein Verzeichnis.")
    EndIf
    Else
    SetError(1, 0, "Es besteht ein grundlegendes Zugriffsproblem auf das Verzeichnis.")
    EndIf
    Return False
    EndFunc ; == > _validatePathAccessRights( $path )
    Alles anzeigen

    Wahrscheinlich geht das auch eleganter, doch ich bin kein Profi und programmiere hier für private Zwecke.

    Zurück zum Problem: Wenn die Validierung ergibt, dass die Schreibrechte für ein Verzeichnis fehlen, dann wird False zurückgegeben, andernfalls True. Das scheint nach meinen bisherigen Tests prima zu funktionieren. Nur nachdem ein False zurückgegeben wurde und anschließend nochmals FileSelectFolder() aufgerufen wird - jetzt jedoch mit einem Verzeichnis als Rückgabewert, für das True bezüglich der Schreibrechte zurückgegeben wird (via ConsoleWrite überprüft) - genau dann passiert das Problem und in der Funktion A kommt die ominöse 0 an. Im übrigen tritt dieses Phänomen auch dann auf, wenn ich die SetError-Zeilen in _validatePathAccessRights() auskommentiere. 🤔

    Wird danach das Prozedere erneut durchlaufen und direkt ein Verezichnis ausgewählt, für das der Anwender Schreibrechte hat, dann stimmt der Rückgabewert an die Funktion A. 🙃

    Wer hat eine Idee, wie ich das Problem beseitigen kann bzw. in welche Richtung ich schauen muss?

    Vielen lieben Dank an allen Mitdenkenden 🙏. Ich wünsche einen Guten Start in das neue Jahr. 🍀

  • Zeitstempel einer bestimmten Datei mit der aktuellen Systemzeit vergleichen

    • Purzel Hägar
    • 24. Dezember 2019 um 20:10

    Hallo water,

    das scheint zu passen und ich denke, damit weiter zu kommen. Super und Dankeschön!

  • Zeitstempel einer bestimmten Datei mit der aktuellen Systemzeit vergleichen

    • Purzel Hägar
    • 24. Dezember 2019 um 15:05

    Hallo Leute,

    nach langer Zeit beschäftige ich mich wieder mit AutoIt, um mir ein kleines Tool zu «basteln». Dabei habe an einer bestimmten Stelle einen «Hänger» und habe nun schon länger im Forum und auch außerhalb nach geeigneten Infos/Tipps gesucht. Ich bin aber noch zu keiner hilfreichen Info gelangt und daher bitte ich um eure Mithilfe.

    Aufgabenstellung:

    • Es soll der Zeitstempel «zuletzt geändert» einer bestimmten Datei mit der aktuellen Systemzeit verglichen werden. Dabei sollen immer die in meiner Zeitzone geltenden Werte, so wie auch von Windows 10 angezeigt (Bsp. über die Eigenschaften) verwendet werden.
    • Damit möchte ich herausfinden, ob der Zeitpunkt der zuletzt durchgeführten Änderung an der betreffenden Datei länger als beispielsweise x Stunden oder y Minuten zum Zeitpunkt der Abfrage zurückliegt.
    • Ob ich den Zeitunterschied in Minuten oder in Stunden durchführe, habe ich noch nicht abschliessend festgelegt. Doch etwas anderes macht (vermutlich) in meinem Kontext keinen Sinn.

    Wer kann mir nun einen möglichst einfachen Weg aufzeigen, wie ich die Aufgabe gelöst bekomme.

    Ich danke allen, die sich der Sache annehmen und mir hilfreiche Infos geben können. :)

    Ansonsten wünsche ich allen frohe Weihnachten.

  • Update des SciTe Editors der AutoIt Distribution

    • Purzel Hägar
    • 26. April 2011 um 17:14

    Hallo und ein herzliches Dank an die fleißigen Mitglieder dieses Forums.

    Ich bin neu hier und nutze ab und an AutoIt um mir ein kleines Tool zu erstellen. Das Forum hat mir schon den einen oder anderen hilfreichen Hinweis gegeben.

    Doch nun zu meiner Frage:
    Ich nutze das "Komplettpaket" Autoit mit integriertem Scite Editor. Die AutoIt Version sollte nach dem ausgeführten Update aktuell sein (3.3.6.1) doch der Editor ist immer noch auf dem Stand 1.79 (Jul 16 2009). Da ich gesehen habe, dass es zwischenzeitlich eine Scite Version 2.25 gibt (http://www.scintilla.org/SciTE.html), wollte ich auch ein Update des Editors durchführen. Habe aber bisher keinen Weg gefunden, ein solches Update durchzuführen. Gibt es eine Möglichkeit den Editor zu aktualisieren - mit der selben Integrationstiefe zu AutoIt wie bisher auch?

    Bitte nicht nach dem Sinn fragen, ob ein solches Update nötig ist. Ich hätte einfach nur gerne das Update eingespielt, wenn den möglich ohne tausend Hacks anwenden zu müssen ;)

    Danke für eure Antworten.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™