Progress: STDOUT und ZIP.exe

  • Hi,

    ich zermarter mir schon seit Wochen das Hirn, habe zwischenzeitlich auch schon aufgegeben, aber nun mal doch eine Frage dazu:

    Ich habe ein kleines Script, das in einer Funktion mit der ZIP.exe Daten (Ordner) komprimiert. Läuft alles einwandfrei, nur möchte ich eigentlich einen ProgressBar haben. Nun ist das ja prinzipiell erst mal kein Problem. Ich könnte mit _FileListToArray und ein wenig Aufwand ja rekursiv alle Ordner und Unterordner durchgehen, bis ich alle Dateien hab, und diese dann mit den Werten aus dem StandardOutput des ZIP-Vorgangs abgleichen. So zumindest meine Theorie.

    1. Ich frage mich nur, ob das nicht auch einfacher geht?
    2. Alle meine bisherigen Versuche mit StdOutRead endeten damit, dass ich das, was die ZIP.exe in Command-Fenster immer schön in einer Zeile ausgab, auch mal über mehrere Zeile zerhackstückt erhalte. Wie kann ich das ändern oder verhindern?

    Sollte sich Punkt 2 nicht ändern lassen, muss ich in StringRegExp wohl über meinen Freischwimmer hinauskommen und lästig viel Zeit investieren. ;)

    Hier das Script. Ihr bräuchtet aber die ZIP.exe und müsstet zum Testen die Angaben anpassen. Es sollte aber reichen, damit ihr eine Idee davon habt, was ich mache.

    Spoiler anzeigen
    [autoit]

    #include "Constants.au3"
    #include "GUIConstants.au3"

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

    $destination = FileGetShortName("D:\Mediendaten\Skripte\zip.zip") ;Muss wohl in der Kurzform sein
    $source = FileGetShortName("D:\Sicherungsdaten\Backup") ;Muss wohl in der Kurzform sein
    $compressionrate = 6 ;Setzt die Option, wie schnell die Dateien komprimiert werden.

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

    $foo = Run("D:\data\zip\zip.exe" & " -R -S -v -" & $compressionrate & " " & $destination & " " & $source & "\*", $source, Default, $STDOUT_CHILD);Parameter -R ist in Verbindung mit dem Working directory auf $source notwendig, um die Daten exakt so zu verarbeiten, wie ich es gerne hätte.

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

    $test = GUICreate("Test", 600, 600)

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

    $test = GUICtrlCreateEdit("", 10, 10, 285, 590)
    $test2 = GUICtrlCreateEdit("", 305, 10, 285, 590)

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

    GUISetState()

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

    While 1
    $line = StdoutRead($foo)
    If @error = 0 Then GUICtrlSetData($test, $line & @CRLF, 1)

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

    ;~ $line2 = StdinWrite($foo)
    ;~ If @error <> 0 Then GUICtrlSetData($test2, $line2 & @CRLF, 1)

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

    $msg = GUIGetMsg()

    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    [/autoit]

    EDIT: Zur Zeit lasse ich das Script die Daten in eine EditBox laufen, um überhaupt zu sehen, was am Ende rumspringt.

    Sollte es nur so möglich sein, wie oben beschrieben, weiß ich wenigstens, dass sich die Mühe lohnt. Ich hab nur keine Lust bei meinen AutoIt-Kenntnissen eine Woche Arbeit in 300 Zeilen Code zu investieren, wenn später jemand dasselbe in 20 Zeilen macht. :D

    Gruß unearth

    Einmal editiert, zuletzt von unearth (26. November 2007 um 17:18)

  • Hallo!

    mein Akku ist jetzt ganz leeer:

    kannst Du damit was anfangen??

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

    ; unziptest.au3 für unearth

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

    #include <file.au3>

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

    $Zipfile="F:\unearth.zip"
    $Befehl=" /C" & "C:\win32uti\uti\unzip.exe -l "
    $Protfile="F:\wasistdrin.txt"

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

    _zipanprot($zipfile,$protfile)

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

    Func _zipanprot($zipfile,$PROTFILE)

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

    ; Inhalt der Zip ans Protokoll hängen:

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

    Dim $StrTempFiles = _TempFile() ; Name für Temp-Datei erzeugen

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

    RunWait(@ComSpec & $Befehl & Chr(34) & $ZipFile & Chr(34) & " > " & $StrTempFiles, "", @SW_HIDE)

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

    $fhFiles = FileOpen($StrTempFiles,0)
    While 1
    $Line = FileReadLine($fhFiles)
    If @error Then ExitLoop
    _protoutput($PROTFILE,$line)
    WEnd
    FileClose($fhFiles)

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

    EndFunc

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

    ; ####################################################################################################

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

    Func _protoutput($PROTFILE,$TEXT)

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

    $datelong = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC

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

    $pfile=Fileopen($Protfile,1)
    ; Check if file opened for reading OK
    If $pfile = -1 Then
    MsgBox(64, "PROTOKOLLDATEI" & " " & $PROTFILE, "kann nicht geöffenet werden",10)
    Exit
    EndIf

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

    FileWrite($pfile, $datelong & " " & $TEXT & @CRLF)

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

    FileClose($pfile)

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

    EndFunc

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