Progessbar mit Robocopy
Wie so viele vor mir, habe auch ich das Rad neu erfunden und eine Progressbar für den Kopiervorgang "erfunden"....
In meinen Fall seht ein Robocopy dahinter (ist ja inzwischen Standard unter Windows):
Die Funktion ist nur C&P und muss auf die jeweiligen Bedürfnisse angepasst werden!
;*************************************************************
; Image mit Robocopy kopieren
; Übergabe: Dateiname mit Pfad vom lokalen Image
; Übergabe: Dateiname mit Pfad von ZielImage
; Übergabe: Flag ob es sich um ein USB-Device handelt
; Rückgabe: ProzessID
; Rückgabe: -1 nicht genügend Platz auf Ziellaufwerk
; Rückgabe: -2 Zielsystem ist nicht NTFS formatiert
;*************************************************************
func rcopy ($lokalimage, $zielimage, $usb)
;local: i:\images\pc30199.wim
;ziel: w:\pc30199.wim
local $von_pfad ;Nur den Pfad woher kopiert wird
local $nach_pfad ;Nur den Pfad wohin kopiert wird
local $von_name ;Dateiname der zu kopierenden Datei
local $nach_name ;Endname der Datei (muss umbenannt werden - geht nicht anders bei Robocopy)
local $tmp, $ret ;Hilfsvariablen
Local $imagesize ;Wie groß ist das Image
local $freespace ;Wieviel Platz ist am Ziellaufwerk
local $only_ntfs ;Ist das Zieldateisystem NTFS
local $pid ;ProzessID des Robocopy
$ret = StringInStr ($lokalimage, "\", 2, -1) ;Das erste "\" von Rechts
$von_pfad = StringLeft ($lokalimage, $ret -1)
$von_name = Stringmid ($lokalimage, $ret +1)
$ret = StringInStr ($zielimage, "\", 2, -1)
$nach_pfad = StringLeft ($zielimage, $ret -1)
$nach_name = Stringmid ($zielimage, $ret +1)
$freespace = round (DriveSpaceFree (StringLeft ($zielimage, StringInStr ($zielimage, "\", 2, 1))))
$imagesize = round (FileGetSize ($lokalimage) / 1048576)
if $test = True Then
print ("Freer Speicher: " & $freespace & " MB")
print ("Imagegröße: " & $imagesize & " MB")
print ("Zieldateisystem: " & DriveGetFileSystem (gettok ($nach_pfad, "\" , 1)))
EndIf
if DriveGetFileSystem (gettok ($nach_pfad, "\" , 1)) <> "NTFS" and $usb = True Then ;NTFS formatiert ?
Return -2
EndIf
if $freespace < $imagesize Then ;Genügend Platz auf dem Zielsystem?
Return -1
EndIf
local $parameter = $von_pfad & ' ' & $nach_pfad & ' "' & $von_name & '"'
If $test = true Then
print ("Parameter an Robocopy: " & @TAB & $parameter)
EndIf
$pid = run(@ComSpec & " /c robocopy /NDL /NJH /NJS /NS /NC /w:5 /r:5 " & $parameter , "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
Return $pid
EndFunc
;*************************************************************
Alles anzeigen
Im Hauptprogramm wird jetzt die PID "überwacht" und der Output Dos Fenster ausgelesen, in eine Zahl umgewandelt und mittels Progressbar dargestellt.
Robocopy gibt im Grunde nur mehr den Prozent-Fortschritt aus....und der geht immer von 0% bis 100% ...
Noch ein Vorteil ist dass es als Prozess läuft und damit das eigentliche AutoIT-Programm nicht "warten" muss...
Der Code ist schon etwas älter und naja, nicht so gut dokumentiert, dieht also eher als Idee als copy & paste Lösung.
lg
Racer