Timer mit Progressbar der läuft während ein Programm läuft

  • Hallo,
    bin gestern erst auf AutoIT gestoßen, als ich nach einer Möglichkeit gesucht habe, eine Dateisicherung für einen Nutzer so einfach und idiotensicher wie möglich zu machen.
    Grund ist, dass diese Person vor kurzem von Ransomware befallen war. Eine Datensicherung war zwar vorhanden, aber die nützt in diesem Fall ja äußerst wenig, wenn die externe auf die gesichert wird, dauerhaft am System ist. Nun soll eine absolut idiotensichere Möglichkeit her, das ordentlich zu machen (heißt Festplatte soll auch immer schön getrennt werden und der Nutzer soll nicht viel mehr machen müssen als 1-2 mal OK zu drücken und die Festplatte an- und abzustöpseln).
    Das ganze soll so nun so ablaufen:
    Alle wichtigen Daten werden mit AOMEI Backupper als Image auf eine lokale Partition gesichert, wenn sich der Benutzer am System anmeldet (oder via Schedule, weiß ich noch nicht)
    Diese Dateien sollen dann mittels SyncToy auf eine externe HDD gesynct werden.
    Ich schreib also grad an einem kleinen Scrypt, welches über den Windows Task Scheduler regelmäßig ausgeführt wird, und als erstes mal über ein logfile prüft, wann die Backups zum letzten mal gesynct wurden. Ist eine gewisse Zeitschwelle überschritten, poppt ein Fenster auf, was dem Nutzer sagt wann das letzte mal gesynct wurde und dass es doch mal wieder an der Zeit wäre.
    Er kann dann abbrechen oder ja sagen. Dann wird geprüft ob die externe angeschlossen ist und ggf. so oft darauf hingewiesen, dass diese angeschlossen werden soll, bis sie auch wirklich angeschlossen ist.
    Dann ruf ich SyncToy über die CMD auf und starte den SyncVorgang.
    Dabei würde ich gerne einen kleinen Timer laufen lassen, der anzeigt, wie lange die Synchronisierung schon dauert. Optimal wäre auch noch ein Fortschrittsbalken, der definitiv nicht genau sein muss! Würde da einfach eine anzunehmende Datenrate für verwenden und ob er dann schon bei 80% fertig ist, oder der Balken schon 100% zeigt und er noch nicht ganz fertig ist, ist nicht so wichtig. Das dient nur zur ungefähren Abschätzung und dass der Anwender nicht denkt da würde nichts mehr passieren und er könne den PC einfach ausschalten. Das (also der Timer+Fortschrittsbalken) ist eigentlich das einzige was mir noch fehlt.
    Weiß nicht genau wie ich das bewerkstelligen soll, weil alles was ich so gefunden hab mir While-Schleifen Arbeitet, und das Programm somit an dieser stelle quasi "stecken bleibt".
    Am Ende würde dann noch der Hinweis kommen, dass die externe jetzt bitte wieder abgestöpselt wird.

    Gibt es da eine Möglichkeit? Oder ist mein Grundgedanke schon falsch?

    Vielen Dank schonmal für euere Bemühungen :)

    2 Mal editiert, zuletzt von s0nny (9. März 2016 um 01:38)

  • Eine ProgressBar die schon 100% zeigt bevor das Backup fertig ist, wirkt nicht nur unschön sondern verleitet auch dazu schon abzustpüseln. Daher rate ich zur Marquee-Progressbar. Timer kannst du mit AdLibRegister machen.

    Einmal editiert, zuletzt von autoBert (9. März 2016 um 18:25) aus folgendem Grund: Skripte überarbeitet

  • Da ich schon länger ein BackUp Programm schreiben wollte hab ich das jetzt mal gemacht.
    Ist allerdings in Java, damit ich Threads benutzen kann, um die Sache etwas zu beschleunigen. (Bei mir den gesamten PC mit 2 Festplatten nach geänderten Dateien zu durchsuchen hat ~8min. gedauert (~1,7TB))
    Man kann das Programm auch mit Parametern starten, was für dich interessant wäre, damit du die Pfade, Ausnahmen und den Datumszeitraum festlegen kannst. Eventuell pack ich noch nen silentmode rein, damit alles ohne gui läuft, und die Ausgaben in die Konsole geschrieben werden

    Bei den Exceptions empfiehlt es sich übrigens, den AppDataOrdner hinzuzufügen... Die ganzen Dateien von Firefox, die der cached sind nicht unbedingt nett zu kopieren :D. Ebenso viele andere Dateien, die von Programmen genutzt werden :D

    Beispielaufruf:

    Run('javaw -jar BackUp.jar -startDate "08.03.2016"',@ScriptDir)

    Viel Spaß damit. Ich denke ich werd das Tool auch fleißig nutzen :)
    (wird sich demnächst auch auf meiner Webside finden)

    MfG Kanashius

    Habs als zip hochgeladen, musst noch entpacken.

  • Hallo sOnny,

    erst mal willkommen hier :thumbup:

    Oder ist mein Grundgedanke schon falsch?

    Der Grundgedanke ist jedem Programmierer sein höchstes Gut. Daher halte an Deiner Idee im Grundgedanke fest.

    Die Vorgehensweise mit dem AOMEI Backupper als Image auf eine lokale Partition würde ich jedoch überdenken. Ich rate driekt zu einem AOMEI Backupper Image (oder Acronis macht das auch super) auf eine externe Festplatten-Lösung.


    Wenn Du den Benutzer vor Ransomware schützen möchtest, sollte auf jeden Fall immer ein abgeschlossenes Image sehr dienlich sein.

    Das (also der Timer+Fortschrittsbalken) ist eigentlich das einzige was mir noch fehlt.
    Weiß nicht genau wie ich das bewerkstelligen soll, weil alles was ich so gefunden hab mir While-Schleifen Arbeitet, und das Programm somit an dieser stelle quasi "stecken bleibt".

    Schau Dir dazu bitte mal die einmaligen Beispiele von UEZ seinem Beitrag unter GDI-Animated-Loading-Waiting-Screens-mit-32-Beispielen an. Mir haben es diese Animationen angetan und sind einfach schöner für den Benutzer, (ist natürlich Geschmacksache) als nur einfache Fortschrittsbalken.

    UEZ hat mir bei diesem Thema beim Einsatz der o. g. Beispiele klasse weitergeholfen. Vielleicht hilft es Dir ja auch für Dein Vorhaben. :saint:

  • Hallo,
    vielen Dank für Eure Antworten.
    Bin leider erst am Wochenende dazu gekommen, am Script weiter zu arbeiten.

    Zitat von autoBert

    Eine ProgressBar die schon 100% zeigt bevor das Backup fertig ist, wirkt nicht nur unschön sondern verleitet auch dazu schon abzustpüseln. Daher rate ich zur Marquee-Progressbar. Timer kannst du mit AdLibRegister machen.

    Der Marquee-Progressbar ist dafür natürlich einiges besser geeignet, hab ich nun auch so umgesetzt :klatschen:

    Die Vorgehensweise mit dem AOMEI Backupper als Image auf eine lokale Partition würde ich jedoch überdenken. Ich rate driekt zu einem AOMEI Backupper Image (oder Acronis macht das auch super) auf eine externe Festplatten-Lösung.
    Wenn Du den Benutzer vor Ransomware schützen möchtest, sollte auf jeden Fall immer ein abgeschlossenes Image sehr dienlich sein.

    Genau das tue ich ja. Ich mache von den Benutzerdaten regelmäßig ein Backup als Image und speichere dieses auf einer lokalen Partition. Das hat den Vorteil, dass das Backup jederzeit im Hintergrund laufen kann, ohne dass der Benutzer etwas tun muss.
    Dann kommt das Script zum Einsatz. Dieses pack ich in den Windowsscheduler und lass es regelmäßig ausführen. Das Script sagt dem Nutzer dann "Hey, hast schon seit 3 Tagen dein Backup nicht mehr gesichert, mach mal wieder!" (ob nun 3 Tage, ein Tag oder vll nur wöchentlich nötig ist muss iletztendlich der Nutzer entscheiden)
    Der Nutzer kann dann sagen OK, dann wird er aufgefordert die externe anzuschließen und OK zu drücken und die Backups werden auf die externe gesichert. Wenn das Backup fertig ist nerv ich den Nutzer noch damit, dass er die externe wieder entfernen muss.
    Damit nehm ich den Nutzer denk ich recht gut an die Hand, und "zwinge" ihn wirklich zu beherzigen, dass das Backupmedium nicht dauerhaft am PC angeschlossen ist.
    Wenn ich das Backup direkt auf die externe machen würde, müsste der Nutzer die externe entweder immer angeschlossen haben (schlecht) oder das Backup selbst starten wenn er die Festplatte angeschlossen hat (schlecht).
    Das einzige was mit meiner Methode halt passieren könnte ist, dass das Backup immer schön auf der lokalen Platte gesichert wird, der Nutzer aber immer die Aufforderung, das Backup auf der externen sichern zu lassen, wegklickt. Aber ab einem gewissen Punkt ist der Nutzer meiner Meinung nach auch selbst in der Pflicht. Und wenn es ihm nicht zuzumuten ist, die externe aller paar Tage anzuschließen wenn der PC ihm den Hinweis schon gibt und einmal OK zu drücken, dann hat er halt einfach pech :D

    Bin wie gesagt soweit durch, hänge nun noch vor einem kleinen "Problem".
    Ich speichere Daten wie den Pfad wo die Backups sind und den Zielpfad in einer .ini-Datei.
    Dafür habe ich noch ein kleines extra Script gemacht, mit dem man diese Config erstellen kann. Das Gui sieht erstmal ungefähr so aus:


    Wie krieg ich es denn hin, dass ich in die Input-Zeile reinklicken kann, und sich dann ein FileSelectFolder-Fenster öffnet? Und wenn ich den Pfad ausgewählt habe, soll der Pfad im Input-Feld stehen.
    Oder alternativ könnt ich mir auch vorstellen rechts neben der Input-Zeile einen kleinen Button mit 3 Punkten zu haben [...], der das FileSelectFolder-Fenster öffnet (soweit erstmal kein Problem, das würd ich noch hinkriegen) und dann widerum den ausgewählten Pfad in das Input-Feld einträgt.
    Oder ist das so nicht möglich?

  • Hallo

    Oder alternativ könnt ich mir auch vorstellen rechts neben der Input-Zeile einen kleinen Button mit 3 Punkten zu haben [...], der das FileSelectFolder-Fenster öffnet (soweit erstmal kein Problem, das würd ich noch hinkriegen) und dann widerum den ausgewählten Pfad in das Input-Feld einträgt.
    Oder ist das so nicht möglich?

    Schau Dir mal das Beispiel von mir an.

    Eventuell bringt es Dich etwas weiter.

  • Hallo,
    hilft!
    Hab allerdings noch ein Problem dabei. Ich kann Ordner auswählen, das funktioniert.
    Wenn ich allerdings Dateien auswählen will, funktioniert das nicht. Ich verwende dann statt der FileSelectFolder() Funktion die FileOpenDialog()-Funktion. Die Datei wird auch wie gewünscht im Inputfeld angezeigt. Wenn ich dann allerdings die config erstellen will, passiert nichts.
    Mach ich das ganze nur für ORdner, funktioniert alles tadellos.
    Auch wenn ich statt des FileOpenDialog-Buttons einfach selbst was reinschreibe erstellt er die Config.
    Es wird also wirklich nur dann keine Config gebaut, wenn ich eine Datei(!) über die FileOpenDialog()-Funktion auswähle.

  • Hallo,
    das ist bereits includiert, hatte ich jetzt nur nicht mitgepostet weil da noch einiges sinnloses mit drin ist. Muss das wenn ich fertig bin erst noch etwas bereinigen. Bzw. ich werd mir dann mal den Inludeorganizer genauer angucken, das klingt äußerst interessant!

    Aber egal was ich mache, sobald ich eine Datei über FileOpenDialog() öffne, schreibt er nichts in die Config.
    Schreib ich was per Hand in das Feld, tut ers.
    Und auch wenn ich die FileOpenDialog() Sachen weglasse und nur die beiden FileSelectFolder() nehme funktioniert es. :(

  • Du sOnny,

    mach einen Test.

    • Öffne die Schaltfläche bei ID-File
    • *Wähle eine Datei aus
    • Drücke Config erstellen
    • *Verfolge den Pfad im Explorer zurück

    Und da liegt Deine fertig geschriebene config.ini

    Wenn Du die config.ini wo anders haben möchtest, .... weißt schon.

  • ... by the Way ist bei IniWriteSection event. noch folgender Satz aus der Hilfe hilfreich.

    Zitat von AutoIt


    If you want to use an ini file with unicode encoding, first create an .ini file
    by using the FileOpen() function with the mode
    parameter set to "Unicode UTF16 Little Endian".

  • Oh Mann, Vielen Dank für Eure Hilfe!
    Hab $configFile von ".\config.ini" auf "@ScriptDir & "\config.ini" geändert und für den Fall, dass noch keine config.ini existiert, erstell ich eine bevor ich drin rumschreiben will. Jetzt funktioniert alles wie gewollt :klatschen: