Filewatcher Loop
Moin,
ich benötige eine Ordnerüberwachung wie folgt :
Ein Verzeichnis wird rekursiv auf Dateieingänge überwacht.
Kommen Dateien dort in diversen Verzeichnissen an, soll das Script die Dateien zählen UND wenn länger als 5 Sekunden keine Dateianzahländerung mehr stattfindet, soll er den FileSystemWatcher "entladen" und die Schleife beenden damit dann weitere Aktionen erfolgen können.
Ich arbeite grad an diesem Script aber leider wartet er das Übermittlungsende (Also 5 Sekunden lang keine weitere Datei dazugekommen) ab.
Hat jemand eine Idee :
ich benötige eine Ordnerüberwachung wie folgt :
Ein Verzeichnis wird rekursiv auf Dateieingänge überwacht.
Kommen Dateien dort in diversen Verzeichnissen an, soll das Script die Dateien zählen UND wenn länger als 5 Sekunden keine Dateianzahländerung mehr stattfindet, soll er den FileSystemWatcher "entladen" und die Schleife beenden damit dann weitere Aktionen erfolgen können.
Ich arbeite grad an diesem Script aber leider wartet er das Übermittlungsende (Also 5 Sekunden lang keine weitere Datei dazugekommen) ab.
Hat jemand eine Idee :
# Pfad zum zu überwachenden Verzeichnis
$verzeichnis = "C:\Verzeichnis\Ueberwachungsverzeichnis\"
# Erstelle einen FileSystemWatcher für das Verzeichnis
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $verzeichnis
# Aktiviere die Überwachung von Dateiänderungen
$watcher.EnableRaisingEvents = $true
# Festlegen der Ereignisse, die überwacht werden sollen
$watcher.IncludeSubdirectories = $false
$watcher.NotifyFilter = [System.IO.NotifyFilters]::FileName -bor [System.IO.NotifyFilters]::LastWrite
# Initialisiere die Variable für die Dateizählung
$dateiZaehler = 0
# Initialisiere den Zeitpunkt der letzten Änderung
$letzteAenderung = Get-Date
# Timer für 5 Sekunden
$timer = New-Object System.Timers.Timer
$timer.Interval = 5000 # 5000 Millisekunden = 5 Sekunden
# Definiere die Aktion, die bei jeder Änderung ausgeführt wird
$action = {
# Zähle die Anzahl der Dateien im Verzeichnis
$dateiAnzahl = (Get-ChildItem -Path $verzeichnis -File).Count
# Überprüfe, ob die Anzahl der Dateien seit 5 Sekunden gleich ist
if ($dateiAnzahl -eq $dateiZaehler) {
$vergangeneZeit = (Get-Date) - $letzteAenderung
if ($vergangeneZeit -ge [TimeSpan]::FromSeconds(5)) {
Write-Host "Die Anzahl der Dateien ist seit 5 Sekunden gleich. Beende die Schleife."
$timer.Stop() # Stoppe den Timer
$timer.Dispose() # Gib die Timer-Ressourcen frei
$watcher.EnableRaisingEvents = $false # Deaktiviere die Überwachung
}
} else {
# Aktualisiere den Zähler und den Zeitpunkt der letzten Änderung
$dateiZaehler = $dateiAnzahl
$letzteAenderung = Get-Date
}
}
# Füge die Aktion dem Ereignis "Changed" hinzu
Register-ObjectEvent -InputObject $watcher -EventName Changed -Action $action -SourceIdentifier FileSystemWatcherEvent
# Starte den Timer
$timer.Start()
# Starte eine Endlosschleife, um das Skript am Laufen zu halten
while ($watcher.EnableRaisingEvents) {
Start-Sleep -Milliseconds 500 # Kurze Pause, um die CPU-Last zu reduzieren
}
# Entferne den FileSystemWatcher und den Timer, wenn das Skript beendet wird
Unregister-Event -SourceIdentifier FileSystemWatcherEvent -Force
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3595890485
Url: https://administrator.de/contentid/3595890485
Ausgedruckt am: 17.11.2024 um 01:11 Uhr
4 Kommentare
Neuester Kommentar
Hi,
ich glaube, Du hast hier die Funktion des Timers mißverstanden. Das ist kein "Wait" oder "Pause". Der Timer macht nur Sinn, wenn man dessen Event "Elapsed" auswertet.
Statt des Timers solltest Du eine Variable "$StopLoop" o.ä. erstellen mit "$false" als Standard.
Im $action-Block setzt Du $StopLoop auf $true, wo Du jetzt $timer.stop() ausführst.
Statt des $timer.Start() lässt Du ein while laufen
Allerdings:
Wenn keine Datei mehr geändert wird, dann wird auch der $action-Block nicht mehr ausgeführt und die Schleife wird nie enden.
Irgendwo stimmt da Deine Logik nicht, oder ich habe diese nicht verstanden.
E.
ich glaube, Du hast hier die Funktion des Timers mißverstanden. Das ist kein "Wait" oder "Pause". Der Timer macht nur Sinn, wenn man dessen Event "Elapsed" auswertet.
Statt des Timers solltest Du eine Variable "$StopLoop" o.ä. erstellen mit "$false" als Standard.
Im $action-Block setzt Du $StopLoop auf $true, wo Du jetzt $timer.stop() ausführst.
Statt des $timer.Start() lässt Du ein while laufen
while(-not $StopLoop) {
Start-Sleep -Milliseconds 500
}
Allerdings:
Wenn keine Datei mehr geändert wird, dann wird auch der $action-Block nicht mehr ausgeführt und die Schleife wird nie enden.
Irgendwo stimmt da Deine Logik nicht, oder ich habe diese nicht verstanden.
E.