Problem mit StdoutRead

  • Moin Gemeinde.

    Ich habe mir ein kleines Tool gebastelt, was mit hilfe von ImageMagick und Exiftool große Mengen bilder in einem Ordner sortiert, verkleinert und so ...

    Dabei ergibt sich ein Problem - wenn ich mit $cmd = Run(@ComSpec & " /c " & $ExifToolPath & " -CreateDate " & $FolderSrcSort & $pic, @ScriptDir, @SW_HIDE, 2) einen Exiftool-Befehl auf ein Bild starte, um das Erstellungsdatum herauszubekommen, so dauert das je nach Bildgröße eine Weile. Das anschließende StdOutRead bringt dann unter Umständen einen leeren Wert zurück, die Bilder werden dann in einen Ordner namens ohne_Datum kopiert. :cursing:

    Das Problem tritt erst auf, seit ich eine Progressbar mitlaufen lasse. Hier mal der Code der entsprechenden Funktion:

    Spoiler anzeigen
    [autoit]


    Func GetCreateDate($pic,$ExifToolPath,$FolderSrcSort)
    $ExifCmd = Run(@ComSpec & " /c " & $ExifToolPath & " -CreateDate " & $FolderSrcSort & $pic, @ScriptDir, @SW_HIDE, 2)
    Sleep (750)
    $CreateDate = StdoutRead ($ExifCmd)
    $CreateDate = StringTrimLeft($CreateDate,34)
    $CreateDate = StringTrimRight($CreateDate,14)
    $CreateYear = StringTrimRight($CreateDate,3)
    $CreateMonth = StringTrimLeft($CreateDate,5)
    If $CreateDate <> "" Then
    $DestFolder = $CreateYear & "_" & $CreateMonth
    Else
    $DestFolder = "_ohne_datum"
    EndIf
    $CreateFolder = $FolderSrcSort & $DestFolder
    If Not FileExists ($CreateFolder & "\*") Then DirCreate ($CreateFolder & "\")
    Return $CreateFolder
    EndFunc

    [/autoit]


    und der Aufruf der Progressbar-Sache:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Func PicSort ()
    $FolderSrcSort = IniRead (@ScriptDir & "\tmp.ini", "PathToFiles", "SrcDir", "")

    [/autoit] [autoit][/autoit] [autoit]

    If $FolderSrcSort = "" Then
    MsgBox (64, "Fehler", "Kein Ordner mit Bildern gewählt!")
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $ExifToolPath = IniRead (@ScriptDir & "\config.ini", "PATH", "Exiftool","")

    [/autoit] [autoit][/autoit] [autoit]

    $file = FileFindFirstFile ($FolderSrcSort & GUICtrlRead($ExtensionSort))
    If $file = -1 Then
    MsgBox (0, "Info", "Keine JPG-Dateien im Ordner " & $FolderSrcSort & " gefunden.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $i=0
    $progressStep = 100/$countProgress
    $bar=0

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $pic = FileFindNextFile ($file)
    If @error Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    GetCreateDate($pic,$ExifToolPath,$FolderSrcSort)

    [/autoit] [autoit][/autoit] [autoit]

    FileCopy ($FolderSrcSort & $pic, $CreateFolder & "\",1)
    $i=$i+1
    $bar +=$progressStep
    ProgressCount($bar)
    WEnd
    $quest = MsgBox (36, "Operation abgeschlossen", "Es wurden " & $i & " Bilder einsortiert." & @LF & "Wollen Sie weitere Bilder bearbeiten?")
    If $quest = 7 Then Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func GetProgressCount($FolderSrc,$Extension)
    ;MsgBox (64, "Debug1", $FolderSrc & @LF & $Extension)
    $file = FileFindFirstFile ($FolderSrc & $Extension)
    $countProgress = 0
    While 1
    $Pic = FileFindNextFile($file)
    If @error Then ExitLoop
    $countProgress = $countProgress+1
    WEnd
    ;MsgBox (64, "Debug1", $countProgress)
    IniWrite (@ScriptDir & "\tmp.ini", "PathToFiles", "SrcDir", $FolderSrc)
    Return $countProgress
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func ProgressCount($count)
    GUICtrlSetData($pBar, $count)
    EndFunc

    [/autoit]


    Das komplette Script hängt am Post dran.
    autoit.de/wcf/attachment/2491/

    Meine AutoitVersion idt 3.2.12.1 und bei ScitTE4Autoit nutze ich die aktuelle Version vom Download hier.

    Danke fürs Nachdenken
    Greets Markus

  • In der neuen AutoIt-Version wartet StdOutRead nicht mehr auf eine Ausgabe, sondern das Skript geht gleich weiter :)
    Also einfach warten, bis das Programm beendet ist. Dann hast du garantiert alles gelesen, was ausgegeben wird.

    [autoit]

    $ExifCmd = Run(@ComSpec & " /c " & $ExifToolPath & " -CreateDate " & $FolderSrcSort & $pic, @ScriptDir, @SW_HIDE, 2)
    $CreateDate = ""
    Do
    $CreateDate &= StdoutRead ($ExifCmd)
    Until @error
    StdioClose($ExifCmd)

    [/autoit]
  • Hab es eingefügt - und siehe da - es funktioniert. :rock:

    Da sag ich doch mal ganz lieb danke. :thumbup:

    Schönen Tag dir.

    Greets