2016-05-03 1 views
0

Ich versuche, ein Verzeichnis für die Erstellung von Dateien zu überwachen. Wenn eine Datei erstellt wird, möchte ich eine einzelne Zeile in eine Protokolldatei schreiben und den Ordner weiter überwachen. Ich verwende diesen Code unten, aber ich bekomme einen doppelten Eintrag in der Protokolldatei.Usinf System.IO.FileSystemWatcher zum Schreiben in eine Protokolldatei, wenn eine Datei erstellt wird

Wenn ich Pausen in die $action setzen, kann ich sehen, dass es zweimal durchläuft, bevor ich auf das nächste Ereignis warte, weshalb es zwei Zeilen in die Protokolldatei schreibt.

Was habe ich falsch gemacht?

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO 
$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "C:\test-folder" 
$watcher.Filter = "*FINAL*" 
$watcher.IncludeSubdirectories = $true 
$watcher.EnableRaisingEvents = $true 
$watcher.InternalBufferSize = 16384 

### DEFINE ACTIONS AFTER A EVENT IS DETECTED 
$action = { $path = $Event.SourceEventArgs.FullPath 
      $changeType = $Event.SourceEventArgs.ChangeType 
      $logline = "$(Get-Date), $changeType, $path" 
      Add-Content "C:\test-folder\created.log" -value $logline 
      }  
### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY 
$created = Register-ObjectEvent $watcher "Created" -Action $action 
# $changed = Register-ObjectEvent $watcher "Changed" -Action $action 
# $deleted = Register-ObjectEvent $watcher "Deleted" -Action $action 
# $renamed = Register-ObjectEvent $watcher "Renamed" -Action $action 
while ($true) {sleep 5} 

Protokolldatei sieht wie folgt aus ...

05/03/2016 11:25:16, Created, C:\test-folder\test1-FINAL-.txt 
05/03/2016 11:25:16, Created, C:\test-folder\test1-FINAL-.txt 
05/03/2016 11:26:10, Created, C:\test-folder\test2-FINAL-.txt 
05/03/2016 11:26:10, Created, C:\test-folder\test2-FINAL-.txt
+0

Sieht OK für mich aus. Bist du sicher, dass du den Beobachter nicht zweimal registriert hast? –

+0

ähm, weiß nicht - wenn ich die ps-Shell schließe und wieder öffne, sollte das irgendwelche Beobachter löschen? - und wenn ich es mit "write and read host" als Pausen in der $ action {ich kann es durch Schleife zweimal sehen. ... – grizlyadams

Antwort

1

Sie dieses Thema lesen sollte LastWrite FileSystemWatcher Powershell: notification

Sie in bestimmten Situationen feststellen, dass ein einzelnes Ereignis Schaffung mehrere Erstellt Ereignisse erzeugt, werden von Ihrer Komponente behandelt. Wenn Sie beispielsweise eine FileSystemWatcher-Komponente verwenden, um die Erstellung neuer Dateien in einem Verzeichnis zu überwachen und sie anschließend mit Notepad zum Erstellen einer Datei zu testen, werden möglicherweise zwei Created-Ereignisse generiert, obwohl nur eine einzige Datei erstellt wurde. Dies liegt daran, dass der Editor während des Schreibvorgangs mehrere Dateisystemaktionen ausführt. Notepad schreibt auf den Datenträger in Batches, die den Inhalt der Datei und dann die Dateiattribute erstellen. Andere Anwendungen können auf die gleiche Weise arbeiten. Da FileSystemWatcher die Betriebssystemaktivitäten überwacht, werden alle Ereignisse, die diese Anwendungen auslösen, erfasst.

+0

oh - ok (Ich benutze Notepad ++, um die Testdatei zu erstellen) Ich habe gerade versucht, ich mit nur einer Dateikopie und das nur eine Zeile im Protokoll erstellt. versuchte es mit winword (was ist, was wird die Dateien in der Live-Umgebung erstellen) und ich habe 3 Ereignisse - zwei für den Dateinamen und einen für die ~ $ dieses Wort erstellt. Also muss ich einen Filter einfügen, um # $ Dateien nicht zu loggen. Aber das löst mein Problem mit der doppelten Eingabe nicht. Ich könnte mit dem doppelten Eintrag in der Protokolldatei leben - aber ich benutze es zu #slack zu senden, und ich will nicht wirklich mehrere Nachrichten. Gibt es einen besseren Weg als FileSystemWatcher? – grizlyadams

+0

Eine andere Möglichkeit besteht darin, den Ordner selbst zu überprüfen. Speichern Sie die aktuellen Dateien in einer Variablen und verwenden Sie compare-object, um zu prüfen, ob neue Dateien vorhanden sind. Wenn es neue Dateien gibt, dann mache einfach was du willst in der if-Anweisung. –

+0

ja - ich hatte darüber nachgedacht, wusste aber nicht wirklich, wo ich anfangen soll :), aber es gibt viele Unterordner mit vielen hundert Dateien, die hinzugefügt werden (obwohl nicht so viele Dateitypen, nach denen ich suche) - ich gerade angenommen, dass der Overhead höher wäre als FSW ... – grizlyadams

0

Ich verwendete den Zeitstempel, um eine globale Variable zu setzen, mit der ich vergleiche, um zu überprüfen, ob es ein Duplikat ist.

nicht die beste Lösung, da potentiell alles, was in einem zweiten Abstand entsteht, immer noch zu einem doppelten Eintrag führt, aber es funktioniert in unserer Situation.

danke für jeden Input.

Verwandte Themen