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
#include "Constants.au3"
#include "GUIConstants.au3"
$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.
$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)
GUISetState()
[/autoit] [autoit][/autoit] [autoit]While 1
$line = StdoutRead($foo)
If @error = 0 Then GUICtrlSetData($test, $line & @CRLF, 1)
;~ $line2 = StdinWrite($foo)
;~ If @error <> 0 Then GUICtrlSetData($test2, $line2 & @CRLF, 1)
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
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.
Gruß unearth