FileCopy erst dann ausführen, wenn Scan-Datei fertiggestellt ist.

  • Hallo,

    wir haben bei der Arbeit mehrere Kopierer/Scanner. Auf diesen Geräten wird unregelmäßig viel eingescannt. Scan to Mail scheidet aus, da viele Scanns über 10MB Größe haben. Nun habe ich die Scan-Maschinen per Interface so konfiguriert, dass die Maschinen auf einen PC (Verteiler der Scanns) zugreifen und jeweils die Scanns (.pdf & .jpg)in definierte Ordner (Abt.1,2,3,4,5,6,7 usw.) kopiert. Von dem Verteieler-PC werden dann die Scans alle 2 Minuten per Batch und Windows-Aufgabenplaner in bereits definierte Netzlaufwerke verschoben.

    Nun möchte ich gerne per AutoIt ein Script schreiben, welches genau diese Aufgabe übernimmt.

    Das kopieren der Dateien bekomme ich mit FileCopy hin. Alle 2 Minuten kopieren würde ich in einer Schleife mit If Mod(@MIN, 5) = 0 Then Filecopy in den Griff bekommen ,wenn keiner von Euch eine sinvollere Idee hat. Somit fallen Batch und Aufgabenplaner weg. Den abteillungsweise Netzwerkordner alle 30 Tage leeren ab Scriptstart habe ich noch keine Idee. Event. wisst ihr wie das gehen könnte.

    Jetzt aber das Problem, für dessen Lösung ich Eure Hilfe auf jeden Fall benötige.
    Die Scanmaschinen generieren im Zielpfad direkt nach Scanbeginn damit, die Scandatei zu erstellen. Das lässt sich nicht ändern. Leider. Weil wenn ein Benutzer 500 Seiten in Farbe einsgecannt, geht er wieder an den Arbeitsplatz und denkt dass das Dokument schon ferig eingescannt und fertiggestellt ist, da er ja schon die Datei sieht, welche über den Scan Verteiler-PC in das Abteilungsverzeichnis gewandert sind. Beim öffnen des Dokumentes fehlt dann entweder die Hälfte des Inhalts und das schlimmste, die Typen benennen die unfertige Datei schon um, bevor der Scanner den Schreibvorgang abgeschlossen hat. Daraus resultiert dann des öfteren ein Chaos. Als Hinweis muss ich sagen, dass keine temporäre Datei on den Scanmaschinen angelegt wird, die man abfangen könnte.

    Wie kann ich bwerkstelligen, dass erst dann, wenn die Scandatei im Verteiler-PC fertiggestellt ist, in den Abteilungsordner verschoben und dem Benutzer sichtbar angezeigt wird. Eine schwierige Frage die ich ohne Kristallkugel nicht lösen könnte. Vielleich hat aber jemand von Euch ein ähnliches Problem schon gelöst und kann mir weiterhelfen.

    Ich freue mich über jeden Vorschlag, sei er noch so abwegig.

    • Offizieller Beitrag

    Den abteillungsweise Netzwerkordner alle 30 Tage leeren ab Scriptstart habe ich noch keine Idee. Event. wisst ihr wie das gehen könnte.

    Die Dateien bekommen doch automatisch ein Erstellungsdatum. Somit einfach alle Dateien, die älter sind als 30 Tage löschen.


    Wie kann ich bwerkstelligen, dass erst dann, wenn die Scandatei im Verteiler-PC fertiggestellt ist, in den Abteilungsordner verschoben und dem Benutzer sichtbar angezeigt wird.

    Diese Dateien sind "in Benutzung" (es liegt ein Datei-Lock darauf).
    Das kannst Du mit "_WinAPI_FileInUse" abfragen und nur wenn die Datei nicht mehr "in Benutzung" ist, lässt Du die Datei kopieren/verschieben.

  • Super, die Ideen sind prima.
    Vielen Dank.

    Allerdings wird es mit der Umsetzung bei beiden Punkten ohne Beispiel bei mir noch hapern.

    Wäre zum löschen der Inhalte des Netzwerkordners FileGetTime der richtige Weg?

    Zu _WinAPI_FileInUse habe ich gar keinen Plan.

    Wär' klasse, wenn Du zu den beiden Punkten noch ein kleines Beispiel posten würdest.

  • Nun ja, weil ich eben mit dem Beispiel von _WinAPI_FileInUse nichts anfangen kann.

    AutoIt
    #include <WinAPIFiles.au3>
    
    
    Local $hFile = FileOpen(@ScriptFullPath)
    
    
    ConsoleWrite(@ScriptName & ' in use: ' & _WinAPI_FileInUse(@ScriptFullPath) & @CRLF)
    FileClose($hFile)
    ConsoleWrite(@ScriptName & ' in use: ' & _WinAPI_FileInUse(@ScriptFullPath) & @CRLF)

    Ich muss ja alle Dateien vom Scan Verteiler-PC in den Netzwerkordner kopieren, bis auf die Dateien, die noch in Benutzung sind. Dieses Vorhaben kann ich aus der Hilfe nicht ableiten. Darum wäre ich für ein Beipiel sehr dankbar.

    Bei FileGetTime fragte ich, ob's der richtige Weg ist oder ob es jemand anders lösen würde. Klar, würde ich mich auch hier um ein kleines Beispiel freuen.

    • Offizieller Beitrag

    Für das löschen nach X Tage habe ich mal eine Funktion geschrieben:


    Zu "_WinAPI_FileInUse": Den Befehl musst Du doch nur in einer If-Anweisung vor FileCopy benutzen:
    If Not _WinAPI_FileInUse($sSource) Then FileCopy($sSource, $sDest)

  • Entschuldigt den Doppelpost:

    Bei meinem Skript gibt es wohl einen Fehler, da die Datei vom Verteiler-PC nicht in den Netzwerkpfad kopiert/verschoben wird. Was mache ich falsch?

    PS: Die Netzwerkordner sind alle verbunden. Berechtigungen zum schreiben im $DestDir1 hat der angemeldete User auf dem Verteiler PC auch.

  • Da hab' ich wohl was falsch verstanden. Die Schleife, so dachte ich soll die Processorlast minimieren. Mein Fehler. Jetzt ist klar, dass das Skript so wie es jetzt ist, gar nicht aus der Schleife herauskommt.
    Ist der Rest vom Code soweit ok oder sollte ich noch etwas berücksichtigen?

    • Offizieller Beitrag

    Ist der Rest vom Code soweit ok oder sollte ich noch etwas berücksichtigen?

    Nein, so wird das nichts! Du kannst dort nicht einfach Quell- und Zielverzeichnis eintragen.
    Du musst alle Dateien im Quellverzeichnis einlesen und dann in einer Schleife einzeln überprüfen, ob sie "in Benutzung" sind.
    Wenn "nein", dann kopieren/verschieben. Wenn "ja", dann erst beim nächsten (nach 2 Minuten) Schleifendurchlauf bearbeiten.
    Es muss also zwei ineinander verschachtelte Schleifen geben. Die äußere ist die "Zeitschleife" und die innere bearbeitet alle Dateien im Quellverzeichnis.

  • Ohjemine, also doch wieder zu hoch für mich. Ich danke für Deine Erklärungen, doch hinbekommen werde ich das alleine nicht. Hab' mir das aiver Weise wieder viel einfach vorgestellt. Würdest Du mir bitte helfen?

    • Offizieller Beitrag

    So, ich habe das Programm fertig (siehe Anhang)! :)
    Das ist jetzt gleich ein komplettes Programm geworden (inkl. GUI). Das Script ist auch vollständig kommentiert.
    Du musst noch die Quell- und Zielverzeichnisse anpassen!
    Und weil Du es ja auf der Arbeit einsetzen willst, wäre es schön, wenn Du als Gegenleistung dem Forum eine Spende zukommen lassen könntest.

  • Hallo Oscar,

    zunächst erst einmal vielen Dank für Deine Hilfe und für die klasse Arbeit, das Skript gleich als komplett fertige Programm-Lösung hier anzubieten. Zum einen bin ich Dir sehr dankbar darüber, da ich es in der Form wie Du es gecoded hast, nicht einfach so hinbekommen hätte, andererseit danke ich Dir für das kommentieren der Befehle und deren logischen Ablauf. Ich denke dass das Skript nicht nur von mir zukünftig eingesetzt werden wird. Ich kann auf jeden Fall daraus wieder vieles lernen.

    Eine kleine Spende habe ich von meinem Privatkonto an das Forum überwiesen. Es sollte auf jeden Fall mehr Geld sein und steht in keinem Verhältnis zu Deiner Mühe. Bitte entschluldige das bereits im Voraus. Leider kann die Firma in der ich arbeite, keine Spenden ausstellen. Das hat Gründe über die ich aber hier, nicht öffentlich diskutieren kann.

    Ich habe auf Deiner privaten Internetseite vergeblich nach einem Spendenkonto gesucht. Daher ging die Spende tatsächlich an den Betreiber des Forums, was für mich auch vollkommen ok ist, jedoch hätte ich Dir selbst auch gerne eine kleine Summe für Deine Mühe überwiesen.

    Auf jeden Fall danke ich Dir und auch den anderen Helfern sowie den Betreibern des Forum sehr für die ganze Unterstützung im Namen aller privaten oder gewerblichen User hier. Auch wenn es manchmal bei ein paar Profis scheppert und außer denen keiner kapiert um was es geht, seid ihr ein klasse Haufen. Respekt!

    • Offizieller Beitrag

    Hallo bazii und auch alle, die hier und in so vielen weiteren Fällen zeigen, dass dieses Forum in fast 11 Jahren Bestehen, seinen Platz zu Recht inne hat. Ich finde es immer wieder beeindruckend, wenn ich solche Beiträge lesen darf. Sie zeigen mir, dass meine tägliche Arbeit hinter den Kulissen seinen Zweck hat und hier so viele User auch nach außen sichtbar, positive Ergebnisse erzielen.

    Das Geld kommt zu 100% dem Erhalt des Forums zu Gute. Ich bin immer noch stolz darauf, dass wir, bis auf kurze Versuche zwischendurch, werbefrei sind und auch in Zukunft bleiben werden.

    AutoIt.de ist gern für euch da.

    Grüße

    René

    • Offizieller Beitrag

    jedoch hätte ich Dir selbst auch gerne eine kleine Summe für Deine Mühe überwiesen.

    Das ist nicht nötig!
    Ich programmiere gern in AutoIt und solche kleinen Programme sind dann eine gute Übung.
    Deine Spende an das Forum ist als Gegenleistung völlig ausreichend. Davon profitiere ich indirekt (durch den Erhalt dieses Forums) ja auch.

    • Offizieller Beitrag

    Oscar hast du dir das alles selbst beigebracht oder hast du das irgendwo gelernt / studiert?

    Als ich gelernt habe, fing das gerade erst an, mit den "Heimcomputern".
    In meinem Bekanntenkreis war ich der Einzige, der sich einen Computer (1983 = Commodore VC20) gekauft hat. Kurz danach hatte sich dann mein Ausbilder auch einen Computer (Sinclair ZX81) gekauft.
    Und nein, ich habe nichts mit IT gelernt.
    Angefangen mit programmieren habe ich später auf einem "Commodore C64". Seit dem hatte ich diverse Computer (anfangs Commodore, Amiga 500, Amiga 4000, später dann Intel-PCs mit Windows 98 und höher).
    Mit AutoIt habe ich vor fast 10 Jahren angefangen und dank dieses Forums kenne ich mich mit AutoIt recht gut aus und habe schon etliche Programme geschrieben (nicht alle hier veröffentlicht).
    Auch wenn ich in letzter Zeit viel in C++ programmiere (wegen Arduino UNO/NANO/MEGA), schreibe ich doch immer wieder auch einiges in AutoIt.