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. Bitnugger

Beiträge von Bitnugger

  • 2 Folder und deren Dateien miteinander vergleichen

    • Bitnugger
    • 13. Oktober 2021 um 07:37

    Hier noch eine Demo mit Ausgabe des Copy-Befehls:

    AutoIt
    ;-- TIME_STAMP   2021-10-13 07:33:49
    
    Opt('MustDeclareVars', 1)
    
    #include <File.au3>
    
    ; Pfade ohne abschließenden Slash!
    
    ;~ Global $g_sPath1 = 'm:\Temp\Dir1', $g_sPath2 = 'm:\Temp\Dir2'
    
    Global $g_sPath1 = @ScriptDir & '\Temp\Dir1', $g_sPath2 = @ScriptDir & '\Temp\Dir2'
    
    Global $g_sSlash1 = StringInStr($g_sPath1, '\') ? '\' : '/'
    Global $g_sSlash2 = StringInStr($g_sPath2, '\') ? '\' : '/'
    Global $g_sSource, $g_sDestination
    
    Global $g_aResult = _CompareDirs($g_sPath1, $g_sPath2)
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $g_aResult --> " & $g_aResult & @LF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @LF)
    
    If UBound($g_aResult) Then
        ConsoleWrite(_ArrayToString($g_aResult, ' | ') & @CRLF & @CRLF)
        _Copy2D($g_aResult)
        _ArrayDisplay($g_aResult, '_CompareDirs("' & $g_sPath1 & '", "' & $g_sPath2 & '")', '', 0, Default, 'Name|Größe|Datum|<=>|Datum|Größe|Name')
    EndIf
    
    Func _Copy2D($g_aResult)
        If Not UBound($g_aResult) Then Return SetError(1)
    
        For $i = 0 To UBound($g_aResult) - 1 Step 1
            Switch $g_aResult[$i][3]
                Case '==' ; Files are identical
                    ContinueLoop
                Case '->' ; Copy from $g_sPath1 to $g_sPath2
                    $g_sDestination = $g_aResult[$i][6] ? $g_aResult[$i][6] : StringReplace($g_aResult[$i][0], $g_sPath1, $g_sPath2)
                    ConsoleWrite('- -> FileCopy("' & $g_aResult[$i][0] & '", "' & $g_sDestination & '", $FC_OVERWRITE + $FC_CREATEPATH)' & @CRLF)
                Case '<-' ; Copy from $g_sPath2 to $g_sPath1
                    $g_sSource = $g_aResult[$i][0] ? $g_aResult[$i][0] : StringReplace($g_aResult[$i][6], $g_sPath2, $g_sPath1)
                    ConsoleWrite('! <- FileCopy("' & $g_aResult[$i][6] & '", "' & $g_sSource & '", $FC_OVERWRITE + $FC_CREATEPATH)' & @CRLF)
            EndSwitch
        Next
    EndFunc   ;==>_Copy2D
    
    Func _CompareDirs($_sPath1, $_sPath2)
        Switch False
            Case StringInStr(FileGetAttrib($_sPath1), 'D') ; ist kein Verzeichnis!
                Return SetError(1, 1)
            Case StringInStr(FileGetAttrib($_sPath2), 'D') ; ist kein Verzeichnis!
                Return SetError(1, 2)
            Case $_sPath1 <> $_sPath2 ; Verzeichnis sind indentisch!
                Return SetError(1, 3)
        EndSwitch
    
        Local $sSlash1 = StringInStr($_sPath1, '\') ? '\' : '/'
        Local $sSlash2 = StringInStr($_sPath2, '\') ? '\' : '/'
    
        ; _FileListToArrayRec ( $sFilePath [, $sMask = "*" [, $iReturn = $FLTAR_FILESFOLDERS [, $iRecur = $FLTAR_NORECUR [, $iSort = $FLTAR_NOSORT [, $iReturnPath = $FLTAR_RELPATH]]]]] )
        Local $aFiles1 = _FileListToArrayRec($_sPath1, '*', $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_RELPATH)
        If @error Then Return SetError(@error, 1) ; 9 - No files/folders found
        Local $aFiles2 = _FileListToArrayRec($_sPath2, '*', $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_RELPATH)
        If @error Then Return SetError(@error, 2)
        ; _ArraySort ( ByRef $aArray [, $iDescending = 0 [, $iStart = 0 [, $iEnd = 0 [, $iSubItem = 0 [, $iPivot = 0]]]]] )
        _ArraySort($aFiles1, 0, 1) ; Muss für _ArrayBinarySearch! _ArraySearch geht auch ohne...
        _ArraySort($aFiles2, 0, 1) ; Muss für _ArrayBinarySearch! _ArraySearch geht auch ohne...
    ;~     _ArrayDisplay($aFiles1, $_sPath1)
    ;~     _ArrayDisplay($aFiles2, $_sPath2)
    
        ; Spalten für FileTime (Last modified) und FileSize (Bytes) hinzufügen
        _ArrayColInsert($aFiles1, 1) ; FileTime
        _ArrayColInsert($aFiles1, 2) ; FileSize
        _ArrayColInsert($aFiles2, 1)
        _ArrayColInsert($aFiles2, 2)
        For $i = 1 To $aFiles1[0][0] Step 1
            $aFiles1[$i][1] = FileGetTime($_sPath1 & $sSlash1 & $aFiles1[$i][0], $FT_MODIFIED, $FT_STRING) ; YYYYMMDDHHMMSS
            $aFiles1[$i][2] = FileGetSize($_sPath1 & $sSlash1 & $aFiles1[$i][0])
        Next
        For $i = 1 To $aFiles2[0][0] Step 1
            $aFiles2[$i][1] = FileGetTime($_sPath2 & $sSlash2 & $aFiles2[$i][0], $FT_MODIFIED, $FT_STRING)
            $aFiles2[$i][2] = FileGetSize($_sPath2 & $sSlash2 & $aFiles2[$i][0])
        Next
    ;~     _ArrayDisplay($aFiles1, $_sPath1)
    ;~     _ArrayDisplay($aFiles2, $_sPath2)
    ;~     Exit
    
        Local $aResult[0][7], $iIndex, $j = 1, $k = 1
        While 1
            If $j > $aFiles1[0][0] Then ExitLoop
            ; _ArraySearch ( Const ByRef $aArray, $vValue [, $iStart = 0 [, $iEnd = 0 [, $iCase = 0 [, $iCompare = 0 [, $iForward = 1 [, $iSubItem = -1 [, $bRow = False]]]]]]] )
    ;~         $iIndex = _ArraySearch($aFiles2, $aFiles1[$j][0], 1, 0, 0, 0, 1, 0)
    
            ; _ArrayBinarySearch ( Const ByRef $aArray, $vValue [, $iStart = 0 [, $iEnd = 0 [, $iColumn = 0]]] )
            $iIndex = _ArrayBinarySearch($aFiles2, $aFiles1[$j][0], 1, 0, 0) ; _ArrayBinarySearch ist schneller als _ArraySearch - das Array muss aber sortiert sein!
            ; _FileListToArrayRec mit $FLTAR_SORT geht dafür nicht, deshalb das _ArraySort!
            If $iIndex > -1 Then
                If $aFiles2[$iIndex][1] = $aFiles1[$j][1] Then
                    _ArrayAdd($aResult, StringFormat('%s|%s|%s|==|%s|%s|%s', _
                            $_sPath1 & $sSlash1 & $aFiles1[$j][0], $aFiles1[$j][2], $aFiles1[$j][1], _
                            $aFiles2[$iIndex][1], $aFiles2[$iIndex][2], $_sPath2 & $sSlash2 & $aFiles2[$iIndex][0]))
                ElseIf $aFiles2[$iIndex][1] > $aFiles1[$j][1] Then
                    _ArrayAdd($aResult, StringFormat('%s|%s|%s|<-|%s|%s|%s', _
                            $_sPath1 & $sSlash1 & $aFiles1[$j][0], $aFiles1[$j][2], $aFiles1[$j][1], _
                            $aFiles2[$iIndex][1], $aFiles2[$iIndex][2], $_sPath2 & $sSlash2 & $aFiles2[$iIndex][0]))
                Else
                    _ArrayAdd($aResult, StringFormat('%s|%s|%s|->|%s|%s|%s', _
                            $_sPath1 & $sSlash1 & $aFiles1[$j][0], $aFiles1[$j][2], $aFiles1[$j][1], _
                            $aFiles2[$iIndex][1], $aFiles2[$iIndex][2], $_sPath2 & $sSlash2 & $aFiles2[$iIndex][0]))
                EndIf
            Else
                _ArrayAdd($aResult, StringFormat('%s|%s|%s|->', _
                        $_sPath1 & $sSlash1 & $aFiles1[$j][0], $aFiles1[$j][2], $aFiles1[$j][1]))
            EndIf
            $j += 1
        WEnd
    
        While 1
            If $k > $aFiles2[0][0] Then ExitLoop
            $iIndex = _ArraySearch($aFiles1, $aFiles2[$k][0])
            If $iIndex = -1 Then _ArrayAdd($aResult, StringFormat('|||<-|%s|%s|%s', _
                    $aFiles2[$k][1], $aFiles2[$k][2], $_sPath2 & $sSlash2 & $aFiles2[$k][0]))
            $k += 1
        WEnd
    
        Return $aResult
    EndFunc   ;==>_CompareDirs
    Alles anzeigen

    Dateien

    _CompareDirs.7z 14,8 kB – 310 Downloads
  • 2 Folder und deren Dateien miteinander vergleichen

    • Bitnugger
    • 13. Oktober 2021 um 03:55

    In Zukunft bitte keine Crosspostings mehr... sonst werde ich dir nicht mehr helfen.

    Hier eine kleine Demo:

    AutoIt
    ;-- TIME_STAMP   2021-10-13 03:44:22
    
    Opt('MustDeclareVars', 1)
    
    #include <File.au3>
    
    Global $g_sAutoItDir = StringRegExp(@AutoItExe, '(.+)\\\.*', 1)[0]
    Global $g_sPath1 = $g_sAutoItDir & '\Include', $g_sPath2 = $g_sAutoItDir & '\Beta\Include'
    
    Global $g_aResult = _CompareDirs($g_sPath1, $g_sPath2)
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $g_aResult --> " & $g_aResult & @LF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @LF)
    _ArrayDisplay($g_aResult, '_CompareDirs("' & $g_sPath1 & '", "' & $g_sPath2 & '")', '', 0, Default, 'Name|Größe|Datum|<=>|Datum|Größe|Name')
    
    Func _CompareDirs($_sPath1, $_sPath2)
        Switch False
            Case FileExists($_sPath1)
                Return SetError(1, 1)
            Case FileExists($_sPath2)
                Return SetError(1, 2)
            Case $_sPath1 <> $_sPath2
                Return SetError(1, 3)
        EndSwitch
    
        Local $sSlash1 = StringInStr($_sPath1, '\') ? '\' : '/'
        Local $sSlash2 = StringInStr($_sPath2, '\') ? '\' : '/'
    
        ; _FileListToArrayRec ( $sFilePath [, $sMask = "*" [, $iReturn = $FLTAR_FILESFOLDERS [, $iRecur = $FLTAR_NORECUR [, $iSort = $FLTAR_NOSORT [, $iReturnPath = $FLTAR_RELPATH]]]]] )
        Local $aFiles1 = _FileListToArrayRec($_sPath1, '*', $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_RELPATH)
        If @error Then Return SetError(@error, 1) ; 9 - No files/folders found
        Local $aFiles2 = _FileListToArrayRec($_sPath2, '*', $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_RELPATH)
        If @error Then Return SetError(@error, 2)
        ; _ArraySort ( ByRef $aArray [, $iDescending = 0 [, $iStart = 0 [, $iEnd = 0 [, $iSubItem = 0 [, $iPivot = 0]]]]] )
        _ArraySort($aFiles1, 0, 1) ; Muss für _ArrayBinarySearch! _ArraySearch geht auch ohne...
        _ArraySort($aFiles2, 0, 1) ; Muss für _ArrayBinarySearch! _ArraySearch geht auch ohne...
    ;~     _ArrayDisplay($aFiles1, $_sPath1)
    ;~     _ArrayDisplay($aFiles2, $_sPath2)
    
        ; Spalten für FileTime (Last modified) und FileSize (Bytes) hinzufügen
        _ArrayColInsert($aFiles1, 1) ; FileTime
        _ArrayColInsert($aFiles1, 2) ; FileSize
        _ArrayColInsert($aFiles2, 1)
        _ArrayColInsert($aFiles2, 2)
        For $i = 1 To $aFiles1[0][0] Step 1
            $aFiles1[$i][1] = FileGetTime($_sPath1 & $sSlash1 & $aFiles1[$i][0], $FT_MODIFIED, $FT_STRING) ; YYYYMMDDHHMMSS
            $aFiles1[$i][2] = FileGetSize($_sPath1 & $sSlash1 & $aFiles1[$i][0])
        Next
        For $i = 1 To $aFiles2[0][0] Step 1
            $aFiles2[$i][1] = FileGetTime($_sPath2 & $sSlash2 & $aFiles2[$i][0], $FT_MODIFIED, $FT_STRING)
            $aFiles2[$i][2] = FileGetSize($_sPath2 & $sSlash2 & $aFiles2[$i][0])
        Next
    ;~     _ArrayDisplay($aFiles1, $_sPath1)
    ;~     _ArrayDisplay($aFiles2, $_sPath2)
    ;~     Exit
    
        Local $aResult[0][7], $iIndex, $j = 1, $k = 1
        While 1
            If $j > $aFiles1[0][0] Then ExitLoop
            ; _ArraySearch ( Const ByRef $aArray, $vValue [, $iStart = 0 [, $iEnd = 0 [, $iCase = 0 [, $iCompare = 0 [, $iForward = 1 [, $iSubItem = -1 [, $bRow = False]]]]]]] )
    ;~         $iIndex = _ArraySearch($aFiles2, $aFiles1[$j][0], 1, 0, 0, 0, 1, 0)
    
            ; _ArrayBinarySearch ( Const ByRef $aArray, $vValue [, $iStart = 0 [, $iEnd = 0 [, $iColumn = 0]]] )
            $iIndex = _ArrayBinarySearch($aFiles2, $aFiles1[$j][0], 1, 0, 0) ; _ArrayBinarySearch ist schneller als _ArraySearch - das Array muss aber sortiert sein!
            ; _FileListToArrayRec mit $FLTAR_SORT geht dafür nicht, deshalb das _ArraySort!
            If $iIndex > -1 Then
                If $aFiles2[$iIndex][1] = $aFiles1[$j][1] Then
                    _ArrayAdd($aResult, StringFormat('1 %s|%s|%s|==|%s|%s|%s', _
                            $_sPath1 & $sSlash1 & $aFiles1[$j][0], $aFiles1[$j][2], $aFiles1[$j][1], _
                            $aFiles2[$iIndex][1], $aFiles2[$iIndex][2], $_sPath2 & $sSlash2 & $aFiles2[$iIndex][0]))
                ElseIf $aFiles2[$iIndex][1] > $aFiles1[$j][1] Then
                    _ArrayAdd($aResult, StringFormat('2 %s|%s|%s|<-|%s|%s|%s', _
                            $_sPath1 & $sSlash1 & $aFiles1[$j][0], $aFiles1[$j][2], $aFiles1[$j][1], _
                            $aFiles2[$iIndex][1], $aFiles2[$iIndex][2], $_sPath2 & $sSlash2 & $aFiles2[$iIndex][0]))
                Else
                    _ArrayAdd($aResult, StringFormat('3 %s|%s|%s|->|%s|%s|%s', _
                            $_sPath1 & $sSlash1 & $aFiles1[$j][0], $aFiles1[$j][2], $aFiles1[$j][1], _
                            $aFiles2[$iIndex][1], $aFiles2[$iIndex][2], $_sPath2 & $sSlash2 & $aFiles2[$iIndex][0]))
                EndIf
            Else
                _ArrayAdd($aResult, StringFormat('4 %s|%s|%s|->', _
                        $_sPath1 & $sSlash1 & $aFiles1[$j][0], $aFiles1[$j][2], $aFiles1[$j][1]))
            EndIf
            $j += 1
        WEnd
    
        While 1
            If $k > $aFiles2[0][0] Then ExitLoop
            $iIndex = _ArraySearch($aFiles1, $aFiles2[$k][0])
            If $iIndex = -1 Then _ArrayAdd($aResult, StringFormat('5 |||<-|%s|%s|%s', _
                    $aFiles2[$k][1], $aFiles2[$k][2], $_sPath2 & $sSlash2 & $aFiles2[$k][0]))
            $k += 1
        WEnd
    
        Return $aResult
    EndFunc   ;==>_CompareDirs
    Alles anzeigen
  • UDF mit interner GUI-Verabeitung für GuiGetMsg- und OnEvent-Mode einsatzfähig -- wie macht ihr es?

    • Bitnugger
    • 12. Oktober 2021 um 16:37
    Zitat von BugFix

    Eine Möglichkeit wäre wohl auch, dass ich mich direkt in den Nachrichtenstrom des Userfensters einklinke und darüber auswerte.

    Für mich die effizienteste Methode... mit geringstem Aufwand für beiden Seiten... zumal du so auch die Kontrolle darüber hast, welche Nachrichten an den User weitergeleitet werden.

    Einen Haken gibt es hier allerdings auch... wenn der User ebenfalls einen Hook verwenden will, um die Nachrichten für die WinProc umzuleiten... denn dann stürzt AutoIt ab. Meine auch irgendwo gelesen zu haben, das laut Microsoft pro Thread nur ein Hook zum Umleiten der WinProc erlaubt ist.


    So stürzt AutoIt ab...

    Code
    Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)

    ...doch so funktioniert es "seltsammerweise"!

    Code
    Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)[0]
  • SciTE - neues Skript für Timestamp / Versionierung

    • Bitnugger
    • 11. Oktober 2021 um 13:39
    Zitat von BugFix

    Ich prüfe nicht über die Attribute...

    Hehe, habe das zwar gesehen und dachte, damit testest du, ob du Schreibzugriff in dem Verzeichnis hast... war wohl doch schon zu müde. ;)

    Das geht natürlich auch und man erspart sich ein require...

    LuaBit werde ich mir aber auch mal genauer anschauen... da fehlen lediglich die x2x Funktionen.

    Zitat von BugFix

    Ich hoffe nur, dass sich da nichts beißt und ich in einem Loop lande.

    An was man alles denken muss... :D

    In Au3OptMustDeclareVars.lua habe ich in folgender Zeile ein \n eingefügt, weil ich den TimeStamp 'freistehend' haben möchte, wenn er nicht in der ersten Zeile steht... evtl. willst du das ja übernehmen.

    editor:InsertText(e, "\nOpt('MustDeclareVars', 1)\n") -- in Zeile hinter TimeStamp (und Leerzeile) einfügen

    Du meinst sicher unter... 8o

    PS: Machst du eigentlich noch was mit Nim?

  • SciTE - neues Skript für Timestamp / Versionierung

    • Bitnugger
    • 11. Oktober 2021 um 05:02

    Bei CommonTools.FolderExists prüfst du ja nicht wirklich, ob _Folder ein Verzeichnis ist... weil du kein BitAND in Lua hast?

    Habe hier zwei Quellen...

    1.) https://github.com/pubnub/lua/blo…n/BinDecHex.lua

    2.) http://www.dialectronics.com/Lua/code/BinDecHex.shtml

    Den Link habe ich hier gefunden: http://lua-users.org/wiki/BitwiseOperators

    Code: IsFolder.lua (github)
    --~-- TIME_STAMP   2021-10-11 04:55:22   v 0.1
    
    --~ local shell = require "shell"
    local bdh = require "BinDecHex"
    
    function dump(t,i)
        local seen={}
        seen[t]=true
        local s={}
        local n=0
        for k in pairs(t) do
            n=n+1 s[n]=k
        end
        table.sort(s)
        for k,v in ipairs(s) do
            print(i,v)
            v=t[v]
            if type(v)=="table" and not seen[v] then
                dump(v,i.."\t")
            end
        end
        print()
    end
    
    dump(bdh, 'bdh')
    
    local file = 'c:\\Program Files (x86)\\AutoIt3\\SciTE'
    print('> file = "'..file..'"')
    local attrib = shell.getfileattr(file)
    if attrib ~= nil then
        print('> shell.getfileattr(file) = '..attrib..' -> '..bdh.Dec2Bin(attrib))
        if bdh.BMAnd(attrib, 16) == '00000016' then print('+ "'..file..'" is a folder!') end
        if bdh.BMAnd(bdh.Dec2Bin(attrib), bdh.Dec2Bin(16)) == '00010000' then print('+ "'..file..'" is a folder!') end
    end
    
    --~ github             dialectronics
    --~ bdh    BMAnd       bdh    BMAnd        *
    --~ bdh    BMNAnd      bdh    BMNAnd
    --~ bdh    BMNot       bdh    BMNot
    --~ bdh    BMOr        bdh    BMOr
    --~ bdh    BMXOr       bdh    BMXOr
    --~ bdh    BShLeft     bdh    BShLeft
    --~ bdh    BShRight    bdh    BShRight
    --~ bdh    Bin2Dec     bdh    Bin2Dec
    --~ bdh    Bin2Hex     bdh    Bin2Hex
    --~ bdh    Dec2Bin     bdh    Dec2Bin      *
    --~ bdh    Dec2Hex     bdh    Dec2Hex
    --~ bdh    Hex2Bin     bdh    Hex2Bin
    --~ bdh    Hex2Dec     bdh    Hex2Dec
    --~ bdh    _M          bdh    _M
    --~ bdh    _NAME       bdh    _NAME
    --~ bdh    _PACKAGE    bdh    _PACKAGE
    --~ bdh    cm
    --~ bdh    cv
    
    --~ > file = "c:\Program Files (x86)\AutoIt3\SciTE"
    --~ > shell.getfileattr(file) = 16 -> 00010000
    --~ + "c:\Program Files (x86)\AutoIt3\SciTE" is a folder!
    --~ + "c:\Program Files (x86)\AutoIt3\SciTE" is a folder!
    Alles anzeigen
  • SciTE - neues Skript für Timestamp / Versionierung

    • Bitnugger
    • 10. Oktober 2021 um 18:41

    Sehr schön...

    Edit: Bekomme folgenden Fehler angezeigt...

    f:\\AutoIt\\AutoIt3_LuaScripts\TimeStampBackup.lua:76: bad argument #1 to 'PositionFromLine' (number expected, got nil)

    Hatte TimeStamp.Type.Line nicht eingefügt...

    Jetzt nervt mich nur, dass die AutoIt3Wrapper_GUI die eingefügten Zeilen an den Anfang des Scripts setzt und der TimeStamp dann nicht mehr in der gewünschten Zeile steht.

    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ;-- TIME_STAMP   2021-10-10 17:11:16   v 0.1

    Ich würde gerne Verzeichnisse/Dateinamen angeben, bei denen kein TimeStamp eingefügt und auch kein Backup gemacht wird. Das hatte ich mir in der alten Version eingebaut.

    Bsp.:

    Exclude.Dirs=c:\Program Files, c:\Program Files (x86), m:

    Exclude.Files=^e_.*, ^Test.*, Exclude.lua

  • Freier RAM abfragen

    • Bitnugger
    • 6. Oktober 2021 um 17:09
    Zitat von Lanealine

    Dann find ichs jedoch umso merkwürdiger, warum das Programm mit "Error allocation Memory." abstürzt.

    Wenn du dein Script nicht zeigst, kann dir hier auch keiner helfen... zumindest die relevanten Zeilen. Evtl. ist der angeforderte Speicherblock zu groß und kann nicht an einem Stück geliefert werden, oder es ist nicht nicht mehr genug in dem angeforderten Bereich frei.

    Zitat von Lanealine

    Kann der Error auch andere Gründe haben als RAM ?

    Ohne Script... ja, sicher.

  • Freier RAM abfragen

    • Bitnugger
    • 6. Oktober 2021 um 13:15

    Schau mal hier: https://answers.microsoft.com/de-de/windows/…8b-1c2e4cea23c1

  • .exe Startparameter aus Variable übergeben?

    • Bitnugger
    • 5. Oktober 2021 um 18:13
    Zitat von diebratwurst

    Beim 2ten Programm startet er leider nicht mit den Variablen Parametern.

    Ich kenne das Programm pro_vb32.exe nicht und finde bei Google auch keine brauchbaren Informationen darüber... aber wenn ein Programm Parameter akzeptiert, dann meist auch einen, um die "Usage" anzuzeigen.

    Bsp.:

    >rd /?

    Entfernt (löscht) ein Verzeichnis. 


    RMDIR [/S] [/Q] [Laufwerk:]Pfad 

    RD [/S] [/Q] [Laufwerk:]Pfad 


    /S Löscht alle Verzeichnisse und Dateien im angegebenen Verzeichnis 

    zusätzlich zu dem Verzeichnis selbst. Wird verwendet, um ganze 

    Verzeichnisbäume zu löschen. 


    /Q Keine Nachfrage, ob die Verzeichnisbäume mit /S entfernt werden 

    sollen.

    Das sollte dann auch mit pro_vb32.exe funktionieren... anstelle von /? wird oft auch /h, -h, --h oder -Help erwartet... und bei unbekannten (oder ohne) Parameter/n wird die Usage meist auch angezeigt.

  • .exe Startparameter aus Variable übergeben?

    • Bitnugger
    • 5. Oktober 2021 um 15:03

    Die Variablen dürfen nicht in Quote "$usr" stehen, da sie ja sonst auch als Text interpretiert werden...

    AutoIt
    Run('wvs.exe -u ' & $usr & ' -p ' & $pwd) ; wenn die Variablen Tabs, Leerzeichen oder '-' enthalten, kann es Probleme geben.
    
    ; dann evtl. so... 
    Run('wvs.exe -u "' & $usr & '" -p "' & $pwd & '"') ; => Run('wvs.exe -u admin -p "Geheim 0-8-1-5"')
    
    ; ich mache das dann auch gerne so...
    Run(StringFormat('wvs.exe -u "%s" -p "%s"', $usr, $pwd)) ; => Run('wvs.exe -u "admin" -p "Geheim 0-8-1-5"')
  • Shellexecute kann Grafikdatei wegen fehlendem Programm nicht starten

    • Bitnugger
    • 4. Oktober 2021 um 21:29
    Zitat von hipfzwirgel

    Hängt das vielleicht mit der Hauptform zusammen?

    Nein.

    Beim Aufruf der Funktion Graphicview hängst du dort in der While-Schleife fest, bis die GUI wieder geschlossen wurde... erst danach kann die MsBox angezeigt werden.

    Da du die relevanten Variablen ($g_hGUI, $g_hGraphic, $g_hImage) eh alle als Global innerhalb der Funktion (sollte man möglichst vermeiden!!!) deklariert hast, verlege die Aufräumarbeiten einfach in die aufrufende Funktion und lass die While-Schleife weg. Deine MsBox fungiert dann quasi als While-Schleife... und sobald die geschlossen wurde und du deinen Report erzeugt hast, kannst du aufräumen.

    _GDIPlus_Startup() sollte besser ausgeführt werden, wenn dein Script gestartet wird, und _GDIPlus_Shutdown() wenn es beendet wird... und nicht bei jedem Funktionsaufruf.

    So macht man das besser:

    AutoIt
    #include <GDIPlus.au3>
    
    _GDIPlus_Startup()
    OnAutoItExitRegister('_Exit')
    
    ; mach irgendwas...
    
    Func _Exit()
        _GDIPlus_Shutdown()
    EndFunc

    Sleep()... einige davon sind überflüssig.

  • Sammelthread "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"

    • Bitnugger
    • 4. Oktober 2021 um 20:10

    Int()

    Zitat von Jon

    AutoIt only has signed int32 and signed int64 types. To store a full unsigned int32 we need to use the int64.

    AutoIt hat nur signierte int32- und signierte int64-Typen. Um ein vollständiges unsigned int32 zu speichern, müssen wir das int64 verwenden.

    Was bedeutet das für uns?

    Aufgefallen ist mir dies erstmals, als ich die Funktion _WinAPI_GetDriveNumber() verwendet habe, die als Ergebnis ein Array mit folgenden Informationen liefert:

    [0] - The type of device ($FILE_DEVICE_*).

    [1] - The device number.

    [2] - The partition number, or (-1) if device cannot be partitioned.

    Hier geht es lediglich um den Wert aus [2] ...wenn der also -1 ist, kann das Device nicht partitioniert werden.

    _WinAPI_GetDriveNumber lieferte mir als Ergebnis für das Laufwerk d: (DVD-Brenner, kein Medium eingelegt) 4294967295! Mein erster Gedanke war: Was soll denn der Quatsch?

    AutoIt
    #include <WinAPIFiles.au3>
    
    Local $aData = _WinAPI_GetDriveNumber('d:')
    If IsArray($aData) Then
        ConsoleWrite('> Info for Drive d:' & @CRLF)
        ConsoleWrite('+   Type of Device: ' & $aData[0] & @CRLF) ; 2 ($FILE_DEVICE_CD_ROM = 0x0002)
        ConsoleWrite('+    Device number: ' & $aData[1] & @CRLF) ; 0
        ConsoleWrite('! Partition number: ' & $aData[2] & @CRLF) ; 4294967295
        ConsoleWrite(@CRLF)
    EndIf
    
    ; Ausgabe:
    ; > Info for Drive d:
    ; +   Type of Device: 2
    ; +    Device number: 0
    ; ! Partition number: 4294967295
    Alles anzeigen

    4294967295... das kann unmöglich die Nummer der Partitionen sein (zumal ja auch kein Medium eingelegt ist), doch -1 ist es auch nicht, oder?

    Schauen wir uns die Funktion _WinAPI_GetDriveNumber also mal genauer an... da wird eine DllStruct erstellt, die nach einem DllCall die ermittelten Daten enthält, welche dann in einem Array zurückgegeben werden.

    Local $tSDN = DllStructCreate('dword;ulong;ulong')

    In $aData[2] ist also der letzte ulong-Wert enthalten... und ulong ist ja 32-bit - so steht es zumindest auch in der AutoIt-Hilfe!

    ULONG 32bit(4bytes) unsigned integer

    Ok, was sagt VarGetType denn dazu und wie sieht 4294967295 denn in hexadezimaler Schreibweise aus? Lassen wir uns das mal anzeigen:

    ConsoleWrite('> $aData[2] = 0x' & Hex($aData[2]) & ' ' & VarGetType($aData[2]) & @CRLF) ; $aData[2] = 4294967295

    > 0x00000000FFFFFFFF Int64

    Ops... Int64... obwohl ulong doch 32-bit ist?

    Fazit:

    Wird das Ergebnis eines DllCalls als ulong (32bit unsigned integer) zurückgegeben, wird es von AutoIt automatisch zu Int64 (64bit signed integer) erweitert, wenn der Wert > 0x7FFFFFFF (2147483647) ist.

    Somit kann bei ulong (bzw. allen unsigned integer-Typen) das Ergebnis nicht einfach auf -1 getestet werden...

    If $aData[2] = -1 Then ...funktioniert nicht! ; ==>> Int64: 0x00000000FFFFFFFF <> -1

    ...sondern muss es zuvor entsprechend umwandeln, in unserem Fall nach Int32.

    If Int($aData[2], 1) = -1 Then ...funktioniert! ; ==>> Int32: 0xFFFFFFFF = -1

    Hier noch mein Test-Script:

    AutoIt
    _Test(4294967295) ; $vData & $iPartNum = Int64
    _Test(0xFFFFFFFF) ; $vData = Int32, $iPartNum = Int64
    _Test(0x7FFFFFFF) ; $vData & $iPartNum = Int32
    _Test(2147483648) ; $vData & $iPartNum = Int64
    
    Func _Test($vData)
        Local $iPartNum, $tSDN = DllStructCreate('dword;ulong;ulong'), $sColor
        DllStructSetData($tSDN, 3, $vData)
        $iPartNum = DllStructGetData($tSDN, 3)
        $sColor = $vData == $iPartNum ? '+' : '!'
        ConsoleWrite('@    $vData    (' & VarGetType($vData) & ') =  ' & $vData & @CRLF)
        ConsoleWrite('@    $iPartNum (' & VarGetType($iPartNum) & ') =  ' & $iPartNum & @CRLF)
    
        ConsoleWrite(StringFormat('> %%i $vData    (%s) = %11i (0x%s)\n', VarGetType($vData), $vData, Hex($vData)))
        ConsoleWrite(StringFormat($sColor & ' %%i $iPartNum (%s) = %11i (0x%s)\n', VarGetType($iPartNum), $iPartNum, Hex($iPartNum)))
    
        ConsoleWrite(StringFormat('> %%s $vData    (%s) = %11s (0x%s)\n', VarGetType($vData), $vData, Hex($vData)))
        ConsoleWrite(StringFormat($sColor & ' %%s $iPartNum (%s) = %11s (0x%s)\n\n', VarGetType($iPartNum), $iPartNum, Hex($iPartNum)))
    EndFunc
    Alles anzeigen

    Ausgabe:

    Int.png

  • Do Until - Systemzeit funktioniert nicht

    • Bitnugger
    • 2. Oktober 2021 um 00:48
    Zitat von Moombas

    Er will nicht 16 Sekunden, sondern 16 Minuten nach der vollen Stunde die Bat ausführen.

    Habe ich mir schon gedacht...

    Zitat von Moombas

    Und ich verstehe nicht ganz warum du auf "And $iCurrentMin = 12" schaust aber scheinbar bekomme ich gerade dazu den Bezug nicht.

    Beim Testen hatte ich die auf 12 gesetzt und dann vergessen, sie wieder auf 0 zu setzen.

    Zitat von Moombas

    $sCMD würde ich wenn schon sofort definiert, als Global Const setzen.

    Ja, kann man machen, muss man aber nicht... Pi ist eine Konstante und die würde ich definitiv auch als Const deklarieren.

    Zitat von Moombas

    Ich halte das mit dem fixen sleep für 1h für gefärlich aber ggf. bin ich da etwas gebrandmarkt von anderen Projekten, wo so etwas nicht hin haute (1h theoretischer sleep <> 1h Realität)? (Einfluss von PC-Auslastung etc.)

    Jeep, du bist gebrantmarkt... 8o ...man kann dafür ohne Probleme eine fixen Wert nehmen, wenn dieser nicht zu groß gewählt wird, damit es auch bei starker PC-Auslastung noch sicher funktioniert. Jede Std. soll der Hund beißen... dann setze ich den fixen Wert halt auf 59 min. - und die restliche Zeit dann mit Sleep(100) oder so in einer zweiten Schleife warten. Bei mir hat das bis dato immer funktioniert.

    Zitat von Moombas

    Desweiteren hat er ja ein "Ausführungsproblem" mit seiner Batch, das sie nicht macht was er will wenn sie über autoit gestartet wird. Das wurde hierbei nun auch nicht beachtet.

    Doch...

    Zitat von Bitnugger

    If Not FileExists($sCMD) Then Exit 1

    ...gestartet wird das Batch ergo... funktioniert aber nicht wie erwartet... evtl. weil ein & Operator, Umleitungszeichen (<>), eine Pipe (|) oder ein CMD-interner Befehl (echo) verwendet wird, und es nicht in einer CMD gestartet wurde.


    Bsp.:

    mkdir m:\123 && pushd m:\123

    dir|find "S"

    dir >m:\dir.txt

    echo Das funktioniert nicht!

    Entweder den Befehl ändern...

    AutoIt
    $sCMD = @ComSpec & " /c " & "D:\AWK\Schnittstelle\Auftraege\PTV_Import.bat"
    AutoIt
    #include <Process.au3>
    $sCMD = "D:\AWK\Schnittstelle\Auftraege\PTV_Import.bat"
    _RunDos($sCMD)

    ... oder das Script mit der Option "Create CUI instead of GUI EXE." kompilieren und dann die Exe ausführen... bin mir aber nicht sicher, ob das funktioniert.

    Zitat von diebratwurst

    Könnt ihr mir sagen warum mein Script nicht funktioniert und die Datei nicht ausführt?

    Kann ShellExecute die Datei nicht finden, wird eine Messagebox angezeigt und das Script beendet... ist dies nicht der Fall, wurde die Datei ausgeführt, aber vorzeitig mit einem Fehler beendet.

  • Url im Hintergrund öffnen und wieder schließen

    • Bitnugger
    • 1. Oktober 2021 um 10:44

    Ja, deine Einstellungen für Putty sind richtig, da du ja den Status ermitteln kannst.

    Zitat von Buscape23

    "SSID string not found"

    Hm, dann wurde der Befehl ja ausgeführt... aber eben die SID nicht gefunden... bist du sicher, dass die richtig ist?

    Hast du das so gemacht?

    SS "<Meine SSID>"

    Bei mir wäre das dann so:

    SS "FRITZ!Box 7590 RS 5G"

    PW "Geheim0815!"

    Ich schaue aber noch mal in die Anleitung, ob ich da was falsch interpretiert habe... bin gespannt, was der der Lieferant antwortet.

  • Url im Hintergrund öffnen und wieder schließen

    • Bitnugger
    • 30. September 2021 um 19:41
    Zitat von Buscape23

    Mit den 10/100/1000 Mbit/s Ethernet-Anschlüssen

    Ok, am Router sollte es demnach also nicht liegen... dann liegt es wohl daran, dass du dein Modul mit Putty (via USB) nicht richtig konfiguriert hast. Hast du die Einstellungen (SSID und PW) überprüft? Dann zeige mal die Ausgabe...

  • Do Until - Systemzeit funktioniert nicht

    • Bitnugger
    • 30. September 2021 um 18:57
    Zitat von diebratwurst

    ich möchte gerne jede Stunde eine .bat ausführen, bzw. Jede Volle Stunde plus 16 Sekunden. (01:16, 02:16 usw.)

    AutoIt
    ;-- TIME_STAMP   2021-09-30 18:57:15
    
    #include <Date.au3>
    
    Opt('MustDeclareVars', 1)
    
    Global $sNowTime, $iCurrentHour, $iCurrentMin, $iCurrentSec, $sCMD = "D:\AWK\Schnittstelle\Auftraege\PTV_Import.bat"
    
    If Not FileExists($sCMD) Then Exit 1
    
    While 1
        $sNowTime = _NowTime(5) ; Display a time using the 24-hour format (hh:mm:ss).
    
        $iCurrentMin  = Int(StringMid($sNowTime, 4, 2))
        $iCurrentSec  = Int(StringRight(_NowTime(5), 2))
    
        If $iCurrentHour <> Int(StringLeft($sNowTime, 2)) And $iCurrentMin = 12 Then
            $iCurrentHour = Int(StringLeft($sNowTime, 2))
    
            While $iCurrentSec < 16
                $iCurrentSec = Int(StringRight(_NowTime(5), 2))
                Sleep(100)
            WEnd
            $sNowTime = StringLeft($sNowTime, 6) & StringRight(' ' & $iCurrentSec, 2)
    
            ConsoleWrite('$sNowTime     = ' & $sNowTime & @CRLF)
            ConsoleWrite('$iCurrentHour = ' & $iCurrentHour & @CRLF)
            ConsoleWrite('$iCurrentMin  = ' & $iCurrentMin & @CRLF)
            ConsoleWrite('$iCurrentSec  = ' & $iCurrentSec & @CRLF)
    
    ;~         If $iCurrentSec >= 16 Then ShellExecute($iCMD)
            If $iCurrentSec >= 16 Then ConsoleWrite($sNowTime & ' ShellExecute("'&$sCMD&'")' & @CRLF)
            Sleep(1000 * 60 * 60) ; 1 Std. warten
            ContinueLoop
        EndIf
    
        Sleep(1000) ; 1 Sec. warten
    WEnd
    Alles anzeigen
  • Möglich oder nicht? Zeitwert aus einem Programm im Hintergrund auslesen und in ein neues Script schreiben

    • Bitnugger
    • 28. September 2021 um 07:50
    Zitat von mikush

    Bei den UDP-Scripts musste ich ja (nur 8| ) in 240 Dateien die IP-Adresse anpassen. Geholfen hat mir dabei der Batch Text Replacer, damit konnte ich mehrere Dateien gleichzeitig, per "Suchen und Ersetzen", abändern. War eine enorme Arbeitserleichterung. Leider hat mir die Testversion die Scripte wegen des Wasserzeichens versaut, weshalb ich die Vollversion erwerben musste, aber die 40,-€ waren es mir wert.

    Falls es jemand nicht kennt und so eine Funktion sucht, dachte ich, ich schreib's mal an.

    Das geht aber auch rel. einfach mit AutoIt...

    Hier mal ein Bsp. ($sFilePath musst du anpassen!):

    AutoIt
    ;-- TIME_STAMP   2021-09-28 07:45:51
    
    #include <File.au3>
    
    Local $sFilePath = 'm:\MyScripts', $aFileList, $sData, $sSearchIP = '192.168.0.1', $sReplaceIP = '192.168.178.1', $hFile, $iWrite
    
    ; TestFiles anlegen
    Local $sTestFile
    If Not FileExists($sFilePath) Then DirCreate($sFilePath)
    $sData = 'Blablabla...' & $sSearchIP & '...Blubblubblub...'
    $sData &= $sData
    For $i = 1 To 5 Step 1
        $sTestFile = $sFilePath & '\TestFile_' & StringFormat('%02i.au3', $i)
        If Not FileExists($sTestFile) Then
            $hFile = FileOpen($sTestFile, $FO_OVERWRITE) ; $FO_APPEND (1), $FO_OVERWRITE (2), $FO_CREATEPATH (8), $FO_BINARY (16), $FO_UTF8 (128), $FO_UTF8_NOBOM (256), $FO_ANSI (512)
            $iWrite = FileWrite($hFile, $sData) + FileClose($hFile) ? FileGetSize($sTestFile) : -1
            If $iWrite < 1 Then
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Error $hFile = ' & $hFile & ' $iWrite = ' & $iWrite & ' FileWrite('&$sTestFile&')' & @CRLF)
                ; Exit 1
            EndIf
        EndIf
    Next
    
    ; IP in allen Files ersetzen
    $aFileList = _FileListToArray($sFilePath, '*.au3', $FLTA_FILES, True)
    For $i = 1 To $aFileList[0] Step 1
        ConsoleWrite('> Read ' & $aFileList[$i] & @CRLF)
        $sData = FileRead($aFileList[$i])
        ConsoleWrite('+ $sData before: ' & $sData & @CRLF)
        $sData = StringRegExpReplace($sData, $sSearchIP, $sReplaceIP)
        ConsoleWrite('- $sData after : ' & $sData & @CRLF)
    
        $hFile = FileOpen($aFileList[$i], $FO_OVERWRITE) ; $FO_APPEND (1), $FO_OVERWRITE (2), $FO_CREATEPATH (8), $FO_BINARY (16), $FO_UTF8 (128), $FO_UTF8_NOBOM (256), $FO_ANSI (512)
        $iWrite = FileWrite($hFile, $sData) + FileClose($hFile) ? FileGetSize($aFileList[$i]) : -1
        If $iWrite < 1 Then
            ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Error $hFile = ' & $hFile & ' $iWrite = ' & $iWrite & ' FileWrite('&$aFileList[$i]&')' & @CRLF)
            ; Exit 1
        EndIf
    Next
    Alles anzeigen
  • Text im Label dynamisch darstellen

    • Bitnugger
    • 25. September 2021 um 00:36
    Zitat von BugFix

    Die Rundungsdifferenzen führen dazu, dass bei mehrfacher Größenänderung du niemals zurück zur Anfangsgröße gelangst.

    Ja, genau das ist das Problem... aber nur mal so als Idee... wir können Windows ja die Größe des Labels bestimmen lassen. Dazu wird dann ein Label in einer separaten GUI erstellt, ohne dabei die Größe anzugeben. Vor Erstellen des Labels setzen wir die Schriftgröße für die GUI entsprechend der Auswertung von WM_SIZING, also größer oder kleiner, die dann auch für das Label verwendet wird. Das Erstellen des Labels wiederholen wir dann mit größerer oder kleinerer Schriftgröße so oft, bis die passende Größe gefunden wurde.

  • Url im Hintergrund öffnen und wieder schließen

    • Bitnugger
    • 24. September 2021 um 14:33

    Im Handbuch steht es sehr gut beschrieben... anstelle PuTTY geht das dann auch mit AutoIt via TCPSend.

    SR Set Relay


    TCP/IP Commands.

    The ESP32LR42 has a built in TCP/IP command set which allows you to control the module

    remotely.

    All commands are sent using plain ASCII text. PuTTY is a good cross platform terminal program to

    use for testing. The TCP/IP port is the one you set-up with the PA command during USB

    configuration. Do not use port 80 as that is reserved for the HTML commands and Webpage.

    SR Set Relay.

    This is used to turn a relay on or off

    To turn Relay 1 on:

    SR 1 1

    The first number is the relay number from 1 to 8.

    The second number is 1 or 0, on or off.

    So turn turn relay 1 off again:

    SR 1 0

    The command will respond with ok or fail.

    SR 1 1

    ok

    SR 1 6

    fail < 6 is not valid, only 1 or 0 for on/off

    SR 9 1

    fail < relay 9 does not exist.

    Dann sollte das etwa so funktionieren:

    AutoIt
    Global $remIP = "192.168.0.3", $remPort = 80, $ConnectedSocket, $recv
    
    TCPStartup()
    $ConnectedSocket = TCPConnect($remIP, $remPort)
    
    TCPSend($ConnectedSocket,"SR 1 1") ; Relais 1 einschalten
    $recv = TCPRecv($ConnectedSocket, 4)
    ConsoleWrite('Relais 1 ("' & $recv & '")' & ($recv = 'ok' ? ' ist nun eingeschaltet' : ' konnte nicht eingeschaltet werden!') & @CRLF)
    
    TCPSend($ConnectedSocket,"SR 4 0") ; Relais 4 ausschalten
    $recv = TCPRecv($ConnectedSocket, 4) ; "ok" or "fail"
    ConsoleWrite('Relais 4 ("' & $recv & '")' & ($recv = 'ok' ? ' ist nun ausgeschaltet' : ' konnte nicht ausgeschaltet werden!') & @CRLF)
    
    TCPCloseSocket($ConnectedSocket)
    TCPShutdown()
    Alles anzeigen
  • Url im Hintergrund öffnen und wieder schließen

    • Bitnugger
    • 24. September 2021 um 13:57
    Zitat von Buscape23

    Der Code gibt mir noch folgende Fehlermeldung:

    Anstelle $fsocket musst du natürlich $ConnectedSocket verwenden... aber wenn du das Modul noch nicht hast, kann das ja nicht funktionieren. Schaue mir gerade mal das Handbuch dazu an...

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™