sugram
Goto Top

Überwachung von Dateien

Hallo

Ich habe hier ein Powershell Script, daß mir bei Veränderungen an bestimmten Dateien eine Email sendet.
Soweit klappt das mittlerweile auch.
Allerdings, wenn ich die Powershell starte, bekomme ich von jeder Datei die in den Verzeichnissen gefunden werden eine Benachrichtigung, daß sie geändert worden sind.
Also wenn da 3 Dateien vorhanden sind, bekomme ich 3 Emails.
Ich lösche die Mails und verändere dann eine Datei und dann erhalte ich auch nur von dieser geänderten Datei die Benachrichtigung.
Ich verstehe nur nicht, weshalb ich beim starten der Powershell von allen Dateien eine Benachrichtigung erhalte.
Hat da jemand ne Idee?

Hier mal der Code

$computers = "1234567"   # Liste der Computernamen  

$folderToWatch = "c\test\TEST"  

$filter = "*.cfg"  

$intervalSeconds = 2   # Intervall in Sekunden (1 Minute)

$emailFrom = "noreplay@xyz.com"  
$emailTo = "user@xyz.com"  
$emailSubject = "CFG Datei geändert!!!"  
$emailSMTPServer = "smtp.com"  

$lastWriteTimeList = @{}   

while ($true) {
    foreach ($computer in $computers) {
        $files = Get-ChildItem -Path "\\$computer\$($folderToWatch.TrimStart('C:\'))" -Filter $filter -Recurse  
        foreach ($file in $files) {
            if ($lastWriteTimeList[$file.FullName] -ne $file.LastWriteTime) {
                $lastWriteTimeList[$file.FullName] = $file.LastWriteTime
                $body = "Die folgende Datei wurde geändert: $($file.FullName)"  
                Send-MailMessage -From $emailFrom -To $emailTo -Subject $emailSubject -Body $body -SmtpServer $emailSMTPServer -encoding ([System.Text.Encoding]::UTF8)
            }
        }
    }
    Start-Sleep -Seconds $intervalSeconds
}

Content-ID: 5976903601

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

Ausgedruckt am: 17.11.2024 um 19:11 Uhr

StefanKittel
StefanKittel 14.02.2023 um 11:43:15 Uhr
Goto Top
Moin,

beim 1. Aufruf ist lastWriteTimeList doch leer.
Du könntest diese Liste z.B. in der Registry oder einer XML-Datei speichern.
Oder beim 1. Durchlauf keine Warnung ausgeben.
Oder das Archiv-Attribute (A) verwenden und danach löschen.

Stefan
sugram
sugram 14.02.2023 um 11:59:16 Uhr
Goto Top
Ok, das mit dem lastWriteTimeList, daß die am Anfang leer ist, hatte ich nicht bedacht.

Zitat von @StefanKittel:


Oder beim 1. Durchlauf keine Warnung ausgeben.

Wie kann ich das denn machen?
Steh da glaube ich auf dem Schlauch.
emeriks
Lösung emeriks 14.02.2023 um 14:23:52 Uhr
Goto Top
Hi,
Du legst z.B. eine Variable $LoopCounter fest
[int]$LoopCounter = 0
Dann 1. Zeile nach dem "While"
$LoopCounter += 1
Und das "Send-MailMessage" kapselst Du in eine IF
IF($LoopCounter -gt 1) {
  Send-MailMessage ...
}

E.
emeriks
Lösung emeriks 14.02.2023 um 14:26:31 Uhr
Goto Top
Oder ohne Counter:

Vor dem 1. "While" eine abgespeckte Variante davon, zum Füllen der Tabelle :

foreach ($computer in $computers) {
  $files = Get-ChildItem -Path "\\$computer\$($folderToWatch.TrimStart('C:\'))" -Filter $filter -Recurse  
  foreach ($file in $files) {
     $lastWriteTimeList[$file.FullName] = $file.LastWriteTime
  }
}
Crusher79
Crusher79 14.02.2023 um 16:30:11 Uhr
Goto Top
https://powershell.one/tricks/filesystem/filesystemwatcher

Für deinen Fall müsste man folgendes nur erweitern:

$ChangeTypes = [System.IO.WatcherChangeTypes]::Created, [System.IO.WatcherChangeTypes]::Deleted

$ChangeTypes = [System.IO.WatcherChangeTypes]::Created, [System.IO.WatcherChangeTypes]::Deleted, [System.IO.WatcherChangeTypes]::Changed

Momentan gibt es dann eine Ausgabe an der Konsole. Kann aber alles sein.

Schau dir mal das Script an...
sugram
sugram 15.02.2023 aktualisiert um 05:25:35 Uhr
Goto Top
Vielen Dank euch allen!


Zitat von @emeriks:

Oder ohne Counter:

Vor dem 1. "While" eine abgespeckte Variante davon, zum Füllen der Tabelle :

foreach ($computer in $computers) {
  $files = Get-ChildItem -Path "\\$computer\$($folderToWatch.TrimStart('C:\'))" -Filter $filter -Recurse  
  foreach ($file in $files) {
     $lastWriteTimeList[$file.FullName] = $file.LastWriteTime
  }
}

Das funktioniert einwandfrei!

Den Vorschlag von Crusher79 schaue ich mir dann auch mal genauer an.