Hilfe bei Erstellung + Einbindung einer Progressbar inkl. Beispiel

  • Ich muss leider einmal eine Frage zu einer/zwei Progressbaren stellen.

    Da ich für meine Softwareinstallationen gerne eine grafische Fortschrittsangabe einbinden wollte, wäre ja eine Progressbar optimal... Im Forum konnte ich auch schon mehrere Scripte entdecken, nur leider weiss ich nicht wie und wo ich die Softwareinstallationen dazwischen einbinden muss, damit alles funktioniert...

    Daher wäre es nett, wenn sich jemand erbarmen könnte und mir dies anhand eines Beispielscriptes (komplett bitte) zeigen könnte.

    Danke.

  • Naja wo ist den das Problem ?
    Sagen wir mal du hast 15 Installationen zu tätigen, dann errechnest du die Stufen des Progressbarupdates so: wert=100/15
    Nach jeder erfolgten Installation setzt du die Progressbaranzeige um +Wert
    In etwa so:

    Code
    funct install()wert_installationsanzahl=15wert_progressschritte=100/wert_
    installationsanzahl
    
    
    ...starte eine installation...wenn eine installation fertig...update progressbar um +
    wert_progressschritte ...nächste installation...
    ...wenn alle fertig, ende...
    
    
    endfunf
  • [OT]Ich liebe die Benutzung dieser Seite mit Opera :wacko:
    Entweder zu viele Zeilenumbrüche nach einer Bearbeitung oder die werden mal eben ganz gelöscht bei einem Neueintrag...[/OT]

  • Moin

    @JaneDoe: Deine lösung funktioniert nur, wenn er mehrere Installer hat, oder das Programm als der eigentliche Installer fungiert.

    Willst du den Installer einbinden oder willst du das dein Programm als Installer fungiert?

    Wenn du es als Installer benutzen möchtest hier eine möglichkeit die ich oft verwende:
    1. Die Dateien die "Installiert" werden in ein .zip einpacken
    2. Dieses .zip in dein Programm per FileInstall integrieren
    3. .zip in Temp-Ordner kopieren
    4. dort entpacken und zuletzt
    5. in den eigentliche Installationsordner kopieren (danach kämen noch allfällige registry-keys)

    Das ganze kann man dann auf der Progressbar so darstellen:
    1. Die gesamtgrösse der schlussendlichen installation (also 1-mal das .zip und 2-mal die entpackten dateien) ausrechnen
    2. Anschliessend wird zuerst das "Installen" des -zip's in den Temp-ordner angezeigt (das wäre dann ein relativ grosser %-schritt...aber egal)
    3. nun das entpacken (in der zip-au3 gibt es glaubich eine möglichkeit den fortschritt auszulesen)
    4. noch das kopieren in den install-ordner (da kann man dann den prozentanteil der jeweiligen einzeldateien ausrechnen lassen und so schöne kleine schritte auf der progress-bar anzeigen lassem)

    Bild1: Ich beim debuggen

    2 Mal editiert, zuletzt von General Kaboom (15. Oktober 2012 um 11:49)

  • Also, das normale Verfahren zum Kopieren mit Progressbar/Prozentanzeige ist folgende:

    Pseudocode
    Code
    1: Ermittle die Größe der zu Kopierenden Quelldaten.
    1.1: Diese Größe ist nun 100%. 
    2: Kopiere die Quelldaten mit einer Windows-Eigenen Funktion (XCOPY.exe), da sonst das Skript beim Kopieren pausieren würde.
    3: Ermittle in einer Schleife die Größe der Zieldaten.
    4: Berechne: Größe der Zieldaten durch Größe der Quelldaten mal 100. Das Ergebnis stellt den Fortschritt in Prozent da.
    5: Wiederhole Schritt 3 & 4, bis die Größe der Zieldaten der Größe der Quelldaten entspricht. 
    6: 100% sind erreicht.

    lg chess

    Edit:
    Hier mal ein Beispiel von autoBert:

    Spoiler anzeigen
    [autoit]


    $sSource = FileSelectFolder("Bitte Quellpfad auswählen", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 1)
    $sDest = FileSelectFolder("Bitte Zielpfad auswählen", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 1)

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

    If $sSource <> $sDest Then
    CopyWithProgress($sSource, $sDest)
    Else
    MsgBox(0, "Fehler", "Quelle und Ziel müssen unterschiedlich sein")
    EndIf

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

    #Include <Date.au3>
    Func CopyWithProgress($srcDir, $destDir) ;Original gigx siehe https://autoit.de/index.php?page…25989#post25989
    Local $tsBeginn = _NowCalc(), $tsDiff =-1, $tsRest ;eingefügt für Restdauer
    If StringRight($srcDir, 1) = "\" Then $srcDir = StringLeft($srcDir, StringLen($srcDir) - 1)
    If StringRight($destDir, 1) <> "\" Then $destDir = $destDir & "\"
    If Not FileExists($destDir) Then DirCreate($destDir)
    $srcSize = DirGetSize($srcDir, 1)
    $1_percent = $srcSize[0] / 100
    Run('XCOPY "'& $srcDir & '" "' & $destDir & '" /D /S /E /V /C /H /R /O /Y /F /G',@TempDir,@SW_HIDE )
    ProgressOn("Advanced status of file copying", "", "",10,10)
    Do
    if $tsDiff < 0 Then Sleep(5000)
    $destSize = DirGetSize($destDir, 1)
    $tsDiff = _DateDiff("s",$tsBeginn,_NowCalc())
    $tsRest = round($tsDiff / ($destSize[0] / $1_percent) * 100,0) - $tsDiff
    ConsoleWrite($tsDiff & " " & $1_percent & " " & $tsRest &@CRLF)
    ProgressSet(Round($destSize[0] / $1_percent, 2), Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2)& " MB copied" & @CRLF _
    & $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
    & $destSize[2] & " of " & $srcSize[2] & " Folders copied.", Round($destSize[0] / $1_percent, 2) & "% - Done! " & $tsRest & " sec. Rest")
    Sleep($tsDiff)
    Until $destSize[0] >= $srcSize[0]
    MsgBox(0,"Fertig in " & $tsDiff & " sec.",Round($destSize[0] / (1024 * 1024), 2) & " MB of " & Round($srcSize[0] / (1024 * 1024), 2)& " MB copied" & @CRLF _
    & $destSize[1] & " of " & $srcSize[1] & " Files copied." & @CRLF _
    & $destSize[2] & " of " & $srcSize[2] & " Folders copied." & @CRLF & Round($destSize[0] / $1_percent, 2) & "% - Done! ")
    ProgressOff()
    EndFunc
    #cs
    /D:M-T-J Kopiert nur die an oder nach dem Datum geänderten Dateien.
    Da kein Datum angegeben, werden nur Dateien kopiert,
    die neuer als die bestehenden Zieldateien sind.
    /S Kopiert Verzeichnisse und Unterverzeichnisse, die nicht leer sind.
    /E Kopiert alle Unterverzeichnisse (leer oder nicht leer).
    /V Überprüft jede neue Datei auf Korrektheit.
    /C Setzt das Kopieren fort, auch wenn Fehler auftreten.
    /H Kopiert auch Dateien mit den Attributen 'Versteckt' und 'System'.
    /R Überschreibt schreibgeschützte Dateien. (eventuell entfernen)
    /O Kopiert Informationen über den Besitzer und ACL.
    /X Kopiert Dateiüberwachungseinstellungen (bedingt /O).
    nicht gesetzt evtl. setzen
    /Y Unterdrückt die Aufforderung zur Bestätigung, dass eine
    vorhandene Zieldatei überschrieben werden soll.
    praktisch aber evtl. entfernen, dann darf run aber nicht mit @SW_HIDE gestartet werden,
    da sonst ein unsichtbares Fenster auf eine Eingabe wartet
    /F Zeigt die Namen der Quell- und Zieldateien beim Kopieren an.
    wenn mit @SW_HIDE gestartet unnötig, da Fenster unsichtbar
    /G Ermöglicht das Kopieren von verschlüsselten Dateien auf ein
    Ziel wo Verschlüsselung nicht unterstützt wird.
    #ce

    [/autoit]


    Quelle

    lg chess :)

  • @All

    Danke erstmal für die schnelle Hilfe.

    Gibt es kein voll.autom. Script, was die Berechnungen durchführen könnte?

    Wenn nein,

    was kommt dann nach der 1. , 2., 3., ... Installation genau hinein, da bei den Beispielen ja immer von einer ausgegangen wird.

    Danke nochmal für eure Mühe.