crashzero
Goto Top

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ß

Content-ID: 9394807215

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

Ausgedruckt am: 27.09.2024 um 23:09 Uhr

em-pie
Lösung em-pie 08.11.2023 aktualisiert um 20:18:41 Uhr
Goto Top
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 ...
Crashzero
Crashzero 09.11.2023 um 07:31:45 Uhr
Goto Top
Hy Danke erstmal,

das ganze ist ein Automatismus, es wird also eher mehr als weniger da keinerlei Löschvorgang stattfinden wird (Erst nachdem Ausstrieg aus der z.B. Do...While.

Also eine Maschine sendet was in das Verzeichnis (Einige hunderte Dateien (Summe ist nicht immer gleich)), dabei kann zwischen der Übermittlung von Datei z.B. 303 und 304 mal ein bis 2 Sekunden "Pause" liegen dann macht er weiter.
Die maximale "Pause" bei der Übermittlung liegt bei ca. 3 Sekunden, daher der Ideenansatz "Ordnerüberwachung und weiterarbeiten erst nach x Sekunden keine neue Datei".

Mit dem Zählen der Dateien ist eine gute Idee, das verfolge ich mal genauer ......

Danke
Crashzero
Crashzero 09.11.2023 aktualisiert um 09:09:54 Uhr
Goto Top
Ok, ich verfolge den Lösungsansatz mit dem Zählen der Dateien.

cls
DO
{
Write-Host @( Get-ChildItem c:\scripte\TESTORDNERÜBERWACHUNG\TESTORDNER\ -Recurse).Count;
$zaehler=Get-ChildItem c:\scripte\TESTORDNERÜBERWACHUNG\TESTORDNER\ -Recurse.Count;
Start-Sleep -Seconds 3
$zaehler2=Get-ChildItem c:\scripte\TESTORDNERÜBERWACHUNG\TESTORDNER\ -Recurse.Count;
} While ($zaehler=$zaehler2)
Write "WEITER GEHTS"  

Ein leeres Verzeichnis liefert ja eine 0 zurück.
Wie komme ich aus der While raus mit den Bedingungen bzw. wie muß ich das Script erweitern :

Wenn die vorherige Zählung und die aktuelle Zählung gleich ist aber NICHT beide den Wert 0 enthalten dann soll er noch 10 Sekunden warten und dann die While verlassen.

Gruß
8030021182
8030021182 09.11.2023 aktualisiert um 10:08:58 Uhr
Goto Top
Hi
# 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
}
Gruß Katrin
Crashzero
Crashzero 09.11.2023 um 09:46:26 Uhr
Goto Top
Schon vielversprechend aber ich verstehe nicht wie ich aus der Schleife komme wenn nach 3 Sekunden keine weiteren Dateien dazukommen.

Ich muß praktisch da raus kommen und weitere Verarbeitungsschritte zu veranlassen ?
em-pie
em-pie 09.11.2023 um 09:49:39 Uhr
Goto Top
Ich muß praktisch da raus kommen und weitere Verarbeitungsschritte zu veranlassen ?
In Zeile 7,5 einfügen $keeprunning = $true
In Zeile 8 while $keeprunning = $true
Irgendwo an entscheidender Stelle zwischen Zeile 9 und 23: $keeprunning = $false
8030021182
8030021182 09.11.2023 aktualisiert um 09:54:28 Uhr
Goto Top
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 face-smile, 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.
Crashzero
Crashzero 09.11.2023 um 10:10:52 Uhr
Goto Top
Zitat von @8030021182:

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 face-smile, 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.

Das geht leider nicht so (Idee ist gut) aber ich muß raus aus der Schleife da danach enorme Verarbeitungen kommen, Dienste pausiert werden usw.
8030021182
8030021182 09.11.2023 aktualisiert um 10:17:40 Uhr
Goto Top
Und du willst das Skri
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.

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.