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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 382822
Url: https://administrator.de/forum/powershell-sendmailmessage-attachement-problem-382822.html
Ausgedruckt am: 02.02.2025 um 01:02 Uhr
15 Kommentare
Neuester Kommentar
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
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
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
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.schau doch einfach nach dem letzten Änderungsdatum der Dateien und bearbeite nur Dateien die in den letzten 5 Minuten nicht geändert wurden.
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.schau doch einfach nach dem letzten Änderungsdatum der Dateien und bearbeite nur Dateien die in den letzten 5 Minuten nicht geändert wurden.
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ß
Zitat von @Balgor:
Das wäre natürlich am besten, nur wissen wir nicht wie
Nicht weiter schwierig:Am besten wäre es natürlich wenn Du prüfst ob die PDF-Datei ordnungsgemäß abgeschlossen ist.
Aber auch am aufwendigsten.
Stefan
Aber auch am aufwendigsten.
Stefan
Das wäre natürlich am besten, nur wissen wir nicht wie
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
}
}
Grüße Uwe
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ß
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ß
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
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