balgor
Goto Top

PowerShell Sendmailmessage attachement Problem

Hallo,

nach einigen Tagen des Versuchens und Googelns versuche ich hier eine Lösung für unser Problem zu finden.

Kurzer Background:

Wir scannen in verschiedenen Standorten via Scan-to-FTP Dokumente an einen Ordner. Diese Dokumente sollen dann regelmäßig per Powershell-Script als E-Mailanhang verschickt werden und dann in einen "erledigt"-Ordner verschoben werden.

Problem:

Soweit funktioniert dies auch prächtig ... es sei denn, die anzuhängende Datei wird noch benutzt. Dies ist hin und wieder der Fall, da die Dokumente einige Seiten umfassen und so schon mal ein paar MB groß werden können. Dazu kommen noch "schlechte" Internetleitungen und dadurch ergeben sich hin und wieder Übertragungszeiten von bis zu 2min+ .

Wenn dann genau im Zeitpunkt des Übertragens das Script anspringt und die Datei als Anhang anfügen will meckert er dass die Datei bereits woanders verwendet wird - sie wird noch hochgeladen.
Verschieben tut er die Datei danach allerdings trotzdem in "erledigt", obwohl er keine Mail geschrieben hat. Der Upload wird dann einfach im "erledigt"-Ordner fortgesetzt und beendet. (Eigentlich soll das verschieben nur bei erfolgreichem Mail-Versand stattfinden)

Frage:

Mein Lösungsansatz war jetzt irgendwie zu Prüfen ob die Datei vollständig hochgeladen ist, oder ob ich exklusiven Zugriff darauf bekommen kann. Vielleicht hat auch jemand noch einen anderen Lösungsansatz?

Mfg Balgor

Content-Key: 382822

Url: https://administrator.de/contentid/382822

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: emeriks
emeriks 09.08.2018 um 08:32:58 Uhr
Goto Top
Hi,
anderer Ansatz:
Verschiebe nicht, sondern kopiere.
Beim nächsten Durchlauf prüfst Du, welche Datei bereits im Kopie-Ordner ist und löschst sie dann das Original. Dann erst versendest Du die nächsten zu versendenden Dateien.

E.
Mitglied: sabines
sabines 09.08.2018 um 08:36:01 Uhr
Goto Top
Moin,

scan to ftp hört sich nach MFP an, wäre da eine Scan to Mail Funktion nicht zielführender?

Gruss
Mitglied: Balgor
Balgor 09.08.2018 aktualisiert um 08:51:01 Uhr
Goto Top
Zitat von @sabines:

Moin,

scan to ftp hört sich nach MFP an, wäre da eine Scan to Mail Funktion nicht zielführender?

Gruss

so haben wir es früher gemacht, aber unsere neuen Drucker unterstützen die Funktion nicht mehr

Außerdem haben sich durch das Script auch andere Anwendungsmöglichkeiten ergeben face-smile wäre also in jedem Fall schön wenn es irgendwie funktioniert
Mitglied: Balgor
Balgor 09.08.2018 um 08:55:23 Uhr
Goto Top
Zitat von @emeriks:

Hi,
anderer Ansatz:
Verschiebe nicht, sondern kopiere.
Beim nächsten Durchlauf prüfst Du, welche Datei bereits im Kopie-Ordner ist und löschst sie dann das Original. Dann erst versendest Du die nächsten zu versendenden Dateien.

E.

Hi,

dadurch würde sich das versenden der Mails um einen weiteren Zyklus verzögern, oder denke ich Falsch?

zzt. läuft das Skript alle 5min - das Maximum der Gefühle eigentlich, da es sich größtenteils um Zeitkritische Sachen handelt möchten wir weitere Verzögerungen möglichst vermeiden.

Aber als Backup-Lösung notiert face-smile
Mitglied: StefanKittel
StefanKittel 09.08.2018 um 09:02:41 Uhr
Goto Top
Hallo,

schau doch einfach nach dem letzten Änderungsdatum der Dateien und bearbeite nur Dateien die in den letzten 5 Minuten nicht geändert wurden.

Alternativ versuche die Dateien in einen Ordner "flow" zu verschieben bevor Du sie bearbeitest.
Wenn dies fehlschlägt ist die Datei noch nicht fertig.

Am besten wäre es natürlich wenn Du prüfst ob die PDF-Datei ordnungsgemäß abgeschlossen ist.
Aber auch am aufwendigsten.

Stefan
Mitglied: emeriks
emeriks 09.08.2018 um 09:05:06 Uhr
Goto Top
dadurch würde sich das versenden der Mails um einen weiteren Zyklus verzögern,
Nein wieso?
1. Durchlauf
  • Datei1 per Mail versenden
  • Datei1 kopieren
  • Datei2 per Mail versenden
  • Datei2 kopieren

2. Durchlauf
  • Datei1 in Kopie & Original vorhanden --> Original löschen
  • Datei2 in Kopie & Original vorhanden --> Original löschen
  • Datei3 per Mail versenden
  • Datei3 kopieren
  • Datei4 per Mail versenden
  • Datei4 kopieren
....
Mitglied: Balgor
Balgor 09.08.2018 um 09:11:23 Uhr
Goto Top
Zitat von @StefanKittel:

Hallo,

schau doch einfach nach dem letzten Änderungsdatum der Dateien und bearbeite nur Dateien die in den letzten 5 Minuten nicht geändert wurden.

Genau sowas schwebte uns vor, aber wir kommen nicht drauf wie wir dies am geschicktesten machen.

Alternativ versuche die Dateien in einen Ordner "flow" zu verschieben bevor Du sie bearbeitest.
Wenn dies fehlschlägt ist die Datei noch nicht fertig.

Genau das haben wir auch schon gemacht, allerdings ist ihm in diesem Fall wurscht ob die Datei schon fertig ist oder nicht:

Datei wird in den "Empfangs-Ordner" hochgeladen - per Skript in einen "Transfer-Ordner" kopiert und erst im transfer-Ordner sollte alles passieren was wir möchten und anschließend in den "Erledigt-Ordner" kopieren. Dabei sind wir aber davon ausgegangen dass er nur "Fertige" Dateien in den transfer-Ordner kopiert werden. Das stimmt allerdings nicht, er verschiebt die halbfertigen Dateien erst in den transfer-Ordner baut dann den Fehler und kopiert die dann immer noch halbfertige Datei in den Erledigt-Ordner und macht dort dann den Upload zuende.

Am besten wäre es natürlich wenn Du prüfst ob die PDF-Datei ordnungsgemäß abgeschlossen ist.
Aber auch am aufwendigsten.

Stefan

Das wäre natürlich am besten, nur wissen wir nicht wie face-smile
Mitglied: StefanKittel
StefanKittel 09.08.2018 um 09:22:16 Uhr
Goto Top
Mitglied: emeriks
emeriks 09.08.2018 um 10:00:44 Uhr
Goto Top
Zitat von @StefanKittel:
schau doch einfach nach dem letzten Änderungsdatum der Dateien und bearbeite nur Dateien die in den letzten 5 Minuten nicht geändert wurden.
Hier muss man sich aber auch merken, wann das Script zuletzt gelaufen ist. Z.B. mittels eines Flags in der Registry. Sonst kann man nicht sicher bestimmen, ob eine Datei beim letzten Lauf schon bekannt war oder nicht. Es kann ja vorkommen, dass das Script mal nicht ausgeführt wird, warum auch immer.
Mitglied: Kraemer
Kraemer 09.08.2018 um 10:33:53 Uhr
Goto Top
Zitat von @emeriks:

Zitat von @StefanKittel:
schau doch einfach nach dem letzten Änderungsdatum der Dateien und bearbeite nur Dateien die in den letzten 5 Minuten nicht geändert wurden.
Hier muss man sich aber auch merken, wann das Script zuletzt gelaufen ist. Z.B. mittels eines Flags in der Registry. Sonst kann man nicht sicher bestimmen, ob eine Datei beim letzten Lauf schon bekannt war oder nicht. Es kann ja vorkommen, dass das Script mal nicht ausgeführt wird, warum auch immer.

du denkst zu kompliziert. Zeitpunkt der letzen Änderung länger als 5 Minuten her: Du kannst los legen. Wenn nicht - ignorieren. Beim nächsten mal kommt die selbe Prüfung. Genau so handhabe ich das auch bei alten Lösungen.
Wo es geht nutze ich neuerdings immer wieder den FileSystemWatcher. Ist ein wenig eleganter und spart einem die Prüfung alle paar Minuten. Ist allerdings auch schwieriger zu handeln.

Gruß
Mitglied: colinardo
Lösung colinardo 09.08.2018 aktualisiert um 12:05:33 Uhr
Goto Top
Zitat von @Balgor:
Am besten wäre es natürlich wenn Du prüfst ob die PDF-Datei ordnungsgemäß abgeschlossen ist.
Aber auch am aufwendigsten.

Stefan

Das wäre natürlich am besten, nur wissen wir nicht wie face-smile
Nicht weiter schwierig:
gci 'D:\Ordner' -Filter *.pdf -File -PipelineVariable file | %{  
    try{
        $f = [IO.File]::OpenWrite($_.FullName); $f.Close()
        write-host "File '$($_.Fullname)' is not in access." -F Green  
        # Send-MailMessage und Move-Item here

    }catch [System.IO.IOException]{
        write-host "'$($file.FullName)' is still in access." -F Yellow  
    }
}
Wer will der kann noch eine Schleife bauen die eine gewisse Zeit wartet bis ein File wieder verfügbar wird. Ansonsten wird's beim nächsten Durchlauf verarbeitet.

Grüße Uwe
Mitglied: Kraemer
Kraemer 09.08.2018 um 10:43:05 Uhr
Goto Top
Dazu eine Frage lieber Uwe,

gibt es tatsächlich keine andere "saubere" Möglichkeit, als eine Exception zu provozieren? Mir hat man nämlich beigebracht, dass "man sowas nicht tut". Interessant finde ich, dass man unter den ersten Google-Treffern genau den selben Ansatz findet (https://msdn.microsoft.com/de-de/library/bb978912.aspx).

Gruß
Mitglied: colinardo
colinardo 09.08.2018 aktualisiert um 12:07:31 Uhr
Goto Top
Mir hat man nämlich beigebracht, dass "man sowas nicht tut".
Wer sagt sowas face-smile? Das ist gängige Praxis und kostet auch keine zus. Zeit...
Mitglied: Balgor
Balgor 09.08.2018 um 12:28:47 Uhr
Goto Top
Zitat von @colinardo:

Zitat von @Balgor:
Am besten wäre es natürlich wenn Du prüfst ob die PDF-Datei ordnungsgemäß abgeschlossen ist.
Aber auch am aufwendigsten.

Stefan

Das wäre natürlich am besten, nur wissen wir nicht wie face-smile
Nicht weiter schwierig:
> gci 'D:\Ordner' -Filter *.pdf -File -PipelineVariable file | %{  
>     try{
>         $f = [IO.File]::OpenWrite($_.FullName); $f.Close()
>         write-host "File '$($_.Fullname)' is not in access." -F Green  
>         # Send-MailMessage und Move-Item here
> 
>     }catch [System.IO.IOException]{
>         write-host "'$($file.FullName)' is still in access." -F Yellow  
>     }
> }
> 
Wer will der kann noch eine Schleife bauen die eine gewisse Zeit wartet bis ein File wieder verfügbar wird. Ansonsten wird's beim nächsten Durchlauf verarbeitet.

Grüße Uwe

Genau so was hatten wir am Anfang im Kopf, aber es mangelte an der richtigen Syntax.

Wir haben dies etwas an unsere Bedürfnisse angepasst und siehe da, es funktioniert!
Schön kurz und knackig und einfach nachvollziehbar.

Vielen herzlichen Dank!
Mitglied: StefanKittel
StefanKittel 09.08.2018 um 13:21:18 Uhr
Goto Top
Zitat von @Kraemer:
Mir hat man nämlich beigebracht, dass "man sowas nicht tut".
Warum sollte man es nicht tun.
Exceptions sind eine prima Möglichkeit Funktionen und Schleifen sauber zu beenden.
Eine Exception muss ja kein Absturz sein und viele Windows-Funktionen kann man nur damit richtig nutzen.
Stefan