crashzero
Goto Top

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 :
# Ü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.

Content-ID: 81443331111

Url: https://administrator.de/forum/schleife-nach-dateieingang-und-neuzaehlung-verlassen-81443331111.html

Ausgedruckt am: 22.12.2024 um 01:12 Uhr

Crusher79
Crusher79 30.01.2024 um 20:18:47 Uhr
Goto Top
Bitte was? Habs nur überflogen, aber $true ist doch immer true....

do ... while... oder do ... unti ...

Da muss eine Abbruchbedigung rein. Wenn bei dir der Wertevergleich halt das gewünschte Ergebnis liefert. ist ja einfacher nummerischer Vergleich.

Sonst hast du eine Endlosschleife.
11078840001
Lösung 11078840001 31.01.2024 aktualisiert um 10:07:56 Uhr
Goto Top
# 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  
Crashzero
Crashzero 31.01.2024 um 10:55:55 Uhr
Goto Top
1A, super und Danke dir .....