Ordnerüberwachung mit 2 Sek. Wartezeit vor Weiterarbeit
Moin,
ich suche nach eine Lösung über Powershell die wie folgt funktioniert.
Ein Ordner wird auf Dateieingang (inkl. Unterordner) überwacht.
Ist ein Dateieingang initiiert und es kommen Dateien in das Verzeichnis soll nicht stumpf x-sekunden gewartet werden um dann danach eine weitere Aktion auszuführen SONDERN
Es soll geprüft werden ob länger als 2 Sekunden KEINE Datei mehr eingegangen ist UND erst dann eine weitere Aktion ausgelöst werden.
Im Moment arbeite ich mit FileSystemWatcher mit einer festeingestellten Zeit in x-sekunden (In der Hoffnung das alle Dateien reingekommen sind) und gehe erst dann weitere Verarbeitungsschritte.
Diese starre Zeit kann zu Problemen führen, daher wäre eine Lösung ala FileSystemWatcher (o.ä.) die in der Lage ist bei einem Dateieingang (Anscheinend letzte Datei angekommen, 2 Sekunden warten ob doch noch was kommt, wenn nicht weitere Verarbeitung).
Mir fehlt irgendwie der Ansatz.
Gruß
ich suche nach eine Lösung über Powershell die wie folgt funktioniert.
Ein Ordner wird auf Dateieingang (inkl. Unterordner) überwacht.
Ist ein Dateieingang initiiert und es kommen Dateien in das Verzeichnis soll nicht stumpf x-sekunden gewartet werden um dann danach eine weitere Aktion auszuführen SONDERN
Es soll geprüft werden ob länger als 2 Sekunden KEINE Datei mehr eingegangen ist UND erst dann eine weitere Aktion ausgelöst werden.
Im Moment arbeite ich mit FileSystemWatcher mit einer festeingestellten Zeit in x-sekunden (In der Hoffnung das alle Dateien reingekommen sind) und gehe erst dann weitere Verarbeitungsschritte.
Diese starre Zeit kann zu Problemen führen, daher wäre eine Lösung ala FileSystemWatcher (o.ä.) die in der Lage ist bei einem Dateieingang (Anscheinend letzte Datei angekommen, 2 Sekunden warten ob doch noch was kommt, wenn nicht weitere Verarbeitung).
Mir fehlt irgendwie der Ansatz.
Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 9394807215
Url: https://administrator.de/contentid/9394807215
Ausgedruckt am: 17.11.2024 um 01:11 Uhr
9 Kommentare
Neuester Kommentar
Moin,
erstmal losgelöst eines PS Scriptes:
vom logischen Ansatz
Alles in einer Do...While Schleife (oder was auch immer).
Bzgl. Hashwert:
du könntest natürlich auch die Anzahl der Dateien zählen und vergleichen, aber wenn jemand eine Datei löscht und direkt eine neue anlegt, fällt das nicht auf.
Ansonsten: https://stackoverflow.com/questions/14714284/powershell-count-items-in-a ...
erstmal losgelöst eines PS Scriptes:
vom logischen Ansatz
- Bilde einen Hashwert über dein Verzeichnis: https://stackoverflow.com/questions/64467425/md5-checksum-hashing-with-p ...
- schreibe den Wert in eine Variable
- Warte 2 Sekunden: https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell ...
- Bilde erneut einen Hashwert über das Verzeichnis und vergleiche beide Werte
- Wenn identisch: tu, was immer du willst.
- Wenn ungleich, starte von vorn
Alles in einer Do...While Schleife (oder was auch immer).
Bzgl. Hashwert:
du könntest natürlich auch die Anzahl der Dateien zählen und vergleichen, aber wenn jemand eine Datei löscht und direkt eine neue anlegt, fällt das nicht auf.
Ansonsten: https://stackoverflow.com/questions/14714284/powershell-count-items-in-a ...
Hi
Gruß Katrin
# Folder
$folder = "D:\test"
$wait = 3
# -------
# initialize state variables
$lastcount = 0
$lasttime = get-date
# constant while loop
while($true){
# get current time
$now = Get-Date
# get files
[array]$files = Get-ChildItem $folder -File -Recurse
# if file count > 0 and last file count = current file count and time >= 3 Seconds ago
if ($files.Count -gt 0 -and $lastcount -eq $files.count -and ($now - $lasttime).TotalSeconds -ge $wait){
# process each file
foreach($file in $files){
# process your files here
}
}
# set state variables
$lastcount = $files.Count
$lasttime = $now
sleep -Seconds $wait
}
Zitat von @Crashzero:
Schon vielversprechend aber ich verstehe nicht wie ich aus der Schleife komme wenn nach 3 Sekunden keine weiteren Dateien dazukommen.
Musst du bei dieser Variante nicht, geschieht alles im Foreach Loop , in diesem machst du alles mit den Dateien und verschiebst sie am Ende aus dem Ordner in einen anderen. Dann geht es von vorne los wenn neue Dateien eintreffen.Schon vielversprechend aber ich verstehe nicht wie ich aus der Schleife komme wenn nach 3 Sekunden keine weiteren Dateien dazukommen.
Und du willst das Skri
Ja und, packst du die halt in ne Function und rufst sie dort auf da ist es egal wie "enorm" das ist.
Willst du das Skript wirklich immer wieder neu starten? Dann mach diei Schleife weg und speichere die Status-Variablen(Zeit/Datei-Counter) in einer Textdatei und lese sie beim Start wieder aus.
Zitat von @Crashzero:
Das geht leider nicht so (Idee ist gut) aber ich muß raus aus der Schleife da danach enorme Verarbeitungen kommen, Dienste pausiert werden usw.
Das geht leider nicht so (Idee ist gut) aber ich muß raus aus der Schleife da danach enorme Verarbeitungen kommen, Dienste pausiert werden usw.
Ja und, packst du die halt in ne Function und rufst sie dort auf da ist es egal wie "enorm" das ist.
Willst du das Skript wirklich immer wieder neu starten? Dann mach diei Schleife weg und speichere die Status-Variablen(Zeit/Datei-Counter) in einer Textdatei und lese sie beim Start wieder aus.