Schleife nach Dateieingang und Neuzählung verlassen
Moin,
ich benötige eine Verzeichnisüberwachung mit Object-Behandlung welche vor dem Verlassen der Schleife die Objecte auch wieder "Unregistert".
Folgendes Szenario :
Ein bestimmter Ordner wird in einer Dauerschleife auf Dateieingäng (Veränderungen) überwacht.
Registriert die Schleifen eine Änderung soll erstmal die Verzeichnis und Dateianzahl gezählt werden, dann 3 Sekunden warten und erneut zählen, ERST wenn die vorherige Zählung (Also vor 3 Sekunden) mit der letzten Zählung übereinstimmt sollen die Objecte "Unregistert" werdne und die Schleife für weitere Tätigkeiten verlaseen werden.
Was ich bis jetzt habe :
Der Switch-Part ist nicht relevant und diente nur zu überprüfungszwecke
Aber das Problem ist das er bei seinen Zählungen nicht die Schleife verlässt wenn er bei der vorherigen Zählung und der erneuten , nach weiteren 3 Sekunden, feststellt das da nix neues mehr dazugekommen ist und er jetzt durchaus die Schleife beenden und die Handler unregistern kann um weitere Scripaktionen aus zu führen.
ich benötige eine Verzeichnisüberwachung mit Object-Behandlung welche vor dem Verlassen der Schleife die Objecte auch wieder "Unregistert".
Folgendes Szenario :
Ein bestimmter Ordner wird in einer Dauerschleife auf Dateieingäng (Veränderungen) überwacht.
Registriert die Schleifen eine Änderung soll erstmal die Verzeichnis und Dateianzahl gezählt werden, dann 3 Sekunden warten und erneut zählen, ERST wenn die vorherige Zählung (Also vor 3 Sekunden) mit der letzten Zählung übereinstimmt sollen die Objecte "Unregistert" werdne und die Schleife für weitere Tätigkeiten verlaseen werden.
Was ich bis jetzt habe :
# Überwachnungsordner
$PathToMonitor = 'C:\Hauptordner\Dateieingang'
# Variable für die Anzahl der Dateien im Verzeichnis
$previousFileCount = (Get-ChildItem -Path $PathToMonitor -File).Count
$FileSystemWatcher = New-Object System.IO.FileSystemWatcher
$FileSystemWatcher.Path = $PathToMonitor
$FileSystemWatcher.IncludeSubdirectories = $true
# Setze events
$FileSystemWatcher.EnableRaisingEvents = $true
# Definiere Änderungsaktionen
$Action = {
$details = $event.SourceEventArgs
$Name = $details.Name
$FullPath = $details.FullPath
$OldFullPath = $details.OldFullPath
$OldName = $details.OldName
$ChangeType = $details.ChangeType
$Timestamp = $event.TimeGenerated
$text = "{0} was {1} at {2}" -f $FullPath, $ChangeType, $Timestamp
Write-Host $text -ForegroundColor Green
# Define change types
switch ($ChangeType)
{
'Changed' { "CHANGE" }
'Created' {
"CREATED"
# Hier kannst du zusätzliche Aktionen für eine neu erstellte Datei einfügen.
}
'Deleted' {
"DELETED"
# Set time intensive handler
Write-Host "Löschen wurde gestartet" -ForegroundColor Gray
Start-Sleep -Seconds 3
Write-Warning -Message 'Löschen vollständig'
}
'Renamed' {
$text = "File {0} umbenannt zu {1}" -f $OldName, $Name
Write-Host $text -ForegroundColor Yellow
}
default { Write-Host $_ -ForegroundColor Red -BackgroundColor White }
}
}
# Event Handler setzen
$handlers = . {
Register-ObjectEvent -InputObject $FileSystemWatcher -EventName Changed -Action $Action -SourceIdentifier FSChange
Register-ObjectEvent -InputObject $FileSystemWatcher -EventName Created -Action $Action -SourceIdentifier FSCreate
Register-ObjectEvent -InputObject $FileSystemWatcher -EventName Deleted -Action $Action -SourceIdentifier FSDelete
Register-ObjectEvent -InputObject $FileSystemWatcher -EventName Renamed -Action $Action -SourceIdentifier FSRename
}
Write-Host "Warte auf Dateieingang in $PathToMonitor" -ForegroundColor Cyan
Write-Host "Abbruch der Überwachung mit CTRL+C" -ForegroundColor Green
try
{
do
{
# Aktuelle Anzahl der Dateien im Verzeichnis
$currentFileCount = (Get-ChildItem -Path $PathToMonitor -File).Count
# Überprüfen, ob die Anzahl der Dateien sich geändert hat
if ($currentFileCount -ne $previousFileCount) {
# Dateianzahl hat sich geändert, setze die Zählung zurück
$previousFileCount = $currentFileCount
Write-Host "Dateianzahl hat sich geändert. Aktion wird ausgeführt."
}
# Wartezeit von 3 Sekunden
Start-Sleep -Seconds 3
Write-Host '.' -NoNewline
} while ($true)
}
finally
{
# Script-Ende Aktionen + CTRL+C führt das Entfernen der Event-Handler durch
Unregister-Event -SourceIdentifier FSChange
Unregister-Event -SourceIdentifier FSCreate
Unregister-Event -SourceIdentifier FSDelete
Unregister-Event -SourceIdentifier FSRename
# Großes Aufräumen
$handlers |
Remove-Job
$FileSystemWatcher.EnableRaisingEvents = $false
$FileSystemWatcher.Dispose()
Write-Warning -Message 'Event Handler abgeschlossen und deaktiviert.'
}
write-Host 'Weiter gehts ...'
Der Switch-Part ist nicht relevant und diente nur zu überprüfungszwecke
Aber das Problem ist das er bei seinen Zählungen nicht die Schleife verlässt wenn er bei der vorherigen Zählung und der erneuten , nach weiteren 3 Sekunden, feststellt das da nix neues mehr dazugekommen ist und er jetzt durchaus die Schleife beenden und die Handler unregistern kann um weitere Scripaktionen aus zu führen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 81443331111
Url: https://administrator.de/contentid/81443331111
Ausgedruckt am: 17.11.2024 um 01:11 Uhr
3 Kommentare
Neuester Kommentar
# quellordner
$source = 'C:\Hauptordner\Dateieingang'
# Dateifilter
$filter = '*.*'
# filesystem watcher erstellen
$fsw = New-Object IO.FileSystemWatcher $source, $filter -Property @{NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite';IncludeSubdirectories=$true}
# event registrieren
Register-ObjectEvent $fsw Created -SourceIdentifier WatcherCreated
cls
write-host "Warte auf neue Datei(en) ... " -F Green
try{
while($true){
# warte darauf das eine Datei erstellt wurde oder timeout nach 2 Sekunden (für CTRL-C)
$cr = $fsw.WaitForChanged([System.IO.WatcherChangeTypes]::Created,2000)
# wenn kein Timeout
if (!$cr.TimedOut){
write-host "Datei '$($cr.Name)' wurde erstellt, warte solange bis 3 Sekunden keine neuen Dateien eintreffen ..." -F Cyan
do{}until($fsw.WaitForChanged([System.IO.WatcherChangeTypes]::Created,3000).TimedOut)
# keine neue Datei für 3 Sekunden, schleife verlassen
break
}
}
}finally{
Unregister-Event -SourceIdentifier WatcherCreated
$fsw.Dispose()
}
write-host "Hier geht's weiter" -F Magenta