none
Hilfe bei Dateiüberwachung benötigt!! RRS feed

  • Frage

  • Hallo zusammen,

    ich bräuchte mal eure Hilfe,

    und zwar versuche ich gerade festzustellen, wann Änderungen an mehreren Datei gemacht wurden.

    Ich habe ein Script gefunden, welches genau die Aufgabe übernimmt, die ich benötige:

    cls
    #Unregister-Event -SourceIdentifier *
    
    $global:Path = Resolve-Path("C:\Users\Mitsch\Desktop\soltec\Daten\“)
    $Folder = (Split-Path $Path)
    
    $Filter = "*.dat"
    
    $FSW = new-object system.io.filesystemwatcher # FileSystemWatcher erstellen
    $FSW.Path = $Folder # zu überwachendes Verzeichnis übergeben
    $FSW.IncludeSubdirectories = $True # Unterverzeichnisse einschließen? 
    $FSW.Filter = $Filter # Filter für die Überwachung… 
    
    function global:out_Text($txt) { Write-Host (“{0}” -f $txt) }
    
    $OnCreate = { 
      $text = “Ereignis: [{0}] in {1} : {2:d}” –f    $eventArgs.ChangeType, 
        $eventArgs.FullPath, $Event.TimeGenerated 
      out_Text ($text) # Funktion out_Text aufrufen und Ausgabetext übergeben
    }
    
    $OnChange = {
      $text = “Ereignis: [{0}] in {1} : {2:d}” –f    $eventArgs.ChangeType, 
        $eventArgs.FullPath, $Event.TimeGenerated
      out_Text ($text) # Funktion out_Text aufrufen und Ausgabetext übergeben
    }
    
    $OnRename = {
      $text = “Ereignis: [{0}] in {1} : {2:d}” –f    $eventArgs.ChangeType, 
        $eventArgs.FullPath, $Event.TimeGenerated
      out_Text ($text) # Funktion out_Text aufrufen und Ausgabetext übergeben
    }
    
    $OnDelete = {
      $text = “Ereignis: [{0}] in {1} : {2:d}” –f    $eventArgs.ChangeType, 
        $eventArgs.FullPath, $Event.TimeGenerated
      out_Text ($text) # Funktion out_Text aufrufen und Ausgabetext übergeben
    }
    
    Register-ObjectEvent -InputObject $FSW `
    -EventName Created -SourceIdentifier FileCreated -Action $OnCreate | Out-Null
    Register-ObjectEvent -InputObject $FSW `
    -EventName Changed -SourceIdentifier FileChanged -Action $OnChange | Out-Null
    Register-ObjectEvent -InputObject $FSW `
    -EventName Renamed -SourceIdentifier FileRenamed -Action $OnRename | Out-Null
    Register-ObjectEvent -InputObject $FSW `
    -EventName Deleted -SourceIdentifier FileDeleted -Action $OnDelete | Out-Null

    Jetzt habe ich nur ein Problem:

    Wenn ich eine Datei umbenenne, lösche und erstelle funktioniert alles wie es soll:

    Es wird EINE Zeile ausgegeben!!!

    Wenn ich nun hingegen in einer Datei etwas ändere, 

    werden ZWEI Zeilen ausgegeben :-(


    Weiß zufällig einer wo hier das Problem liegt???

    Dann noch eine andere Frage,

    für mich ist besonders von Interesse, wenn eine Datei verändert wurde!

    Wie kann ich dies nun weiterverarbeiten??

    Also wenn festgestellt wurde, dass sich etwas in der Datei geändert hat, möchte ich weitere Aktionen machen...

    Vielen Dank im Vorraus 

    Montag, 24. März 2014 17:20

Antworten

Alle Antworten

  • Also das mit dem weiterverarbeiten klappt nun...

    Jetzt ist nur noch die Frage, warum bei einer Änderung der Datei 2 Zeilen ausgegeben werden???

    Oder weiß jemand eine Möglichkeit, wie ich dies abfangen kann?

    Da ich gerne bei einer Änderung weitere Schritte ausführen möchte, ist das Problem mit der doppelten Zeile sehr blöd, da die folgenden Schritte sonst doppelt ausgeführt werden würden!

    Sorry für solch einfache fragen, ich bin erst am Anfang meiner "Programmierkarriere" ....

    Montag, 24. März 2014 20:16
  • Am 24.03.2014 schrieb Mitsch86:

    Jetzt ist nur noch die Frage, warum bei einer Änderung der Datei 2 Zeilen ausgegeben werden???

    Welche genauen Zeilen werden denn ausgegeben? Vermutlich wird OnChange
    und OnRename ausgelöst.


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Dienstag, 25. März 2014 06:21
  • Schonmal vielen Dank für die Antwort!

    Bei einer Änderung IN der Datei, wird 2 mal die Zeile OnChange ausgegeben!

    Wird die Datei umbennant funktioniert alles: Es wird eine Zeile ausgegeben.

    Wird jedoch der Inhalt der Datei verändert, wird der Text 2 mal ausgegeben.

    Leider kann ich noch keien Screenshots anhängen, da mein Account noch nicht verifiziert wurde.

    Während ich den Text geschrieben habe, habe ich das Problem entdeckt:

    Es liegt am Editor! Wenn ich nun eine Bilddatei überwache und diese mit Paint verändere funktioniert das ganze, es wird nur ein Change ausgegeben.

    Wenn ich nun aber eine Textdatei überwache und diese mit dem Editor verändere und anschließend speicher, bekomm ich 2 Zeilen!

    Noch eine weitere Frage:

    mich interessieren 4 spezielle Dateien. Wie schaffe ich es nur diese zu überwachen?

    Leider funktioniert mein erster Ansatz mit dem Filter nicht :

    $global:Path = Resolve-Path("C:\Users\wiedermm\Desktop\soltec\Daten\“)
    $Folder = (Split-Path $Path)
    $Filter = @("nozzle.dat","track.dat","recipe.dat","paramet2.dat")
    $FSW = new-object system.io.filesystemwatcher  # FileSystemWatcher erstellen
    $FSW.Path = $Folder # zu überwachendes Verzeichnis übergeben
    $FSW.IncludeSubdirectories = $False # Unterverzeichnisse einschließen? 

    Dienstag, 25. März 2014 07:36
  • Am 25.03.2014 schrieb Mitsch86:

    Leider kann ich noch keien Screenshots anhängen, da mein Account noch nicht verifiziert wurde.

    Du kannst hier deinen Account verifizieren lassen:
    http://social.microsoft.com/Forums/en-US/reportabug/thread/9c6dfcc5-2e1c-4998-b25e-42d62bdd4519#9c6dfcc5-2e1c-4998-b25e-42d62bdd4519

    Während ich den Text geschrieben habe, habe ich das Problem entdeckt:

    Es liegt am Editor! Wenn ich nun eine Bilddatei überwache und diese mit Paint verändere funktioniert das ganze, es wird nur ein Change ausgegeben.

    Wenn ich nun aber eine Textdatei überwache und diese mit dem Editor verändere und anschließend speicher, bekomm ich 2 Zeilen!

    Wahrscheinlich wird beim ändern und beim speichern das OnChange
    ausgelöst.

    Noch eine weitere Frage:

    mich interessieren 4 spezielle Dateien. Wie schaffe ich es nur diese zu überwachen?
    Leider funktioniert mein erster Ansatz mit dem Filter nicht :

    $global:Path = Resolve-Path("C:\Users\wiedermm\Desktop\soltec\Daten\“)
    $Folder = (Split-Path $Path)
    $Filter = @("nozzle.dat","track.dat","recipe.dat","paramet2.dat")
    $FSW = new-object system.io.filesystemwatcher    # FileSystemWatcher erstellen
    $FSW.Path = $Folder # zu überwachendes Verzeichnis übergeben
    $FSW.IncludeSubdirectories = $False # Unterverzeichnisse einschließen? 

    Den Filter solltest Du pipen, anstatt ein Komma benutzen.
    http://www.dacomsys.de/powershell-filesystemwatcher-uberwachung-von-verzeichnissen/


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    • Als Antwort markiert Alex Pitulice Dienstag, 1. April 2014 12:43
    Dienstag, 25. März 2014 09:26
  • Hallo,

    hier kannst Du naeheres ueber die Klasse FileSystemWatcher erfahren!

    Man beachte insbesondere auch diesen Satz:

    Beachten Sie, dass ein FileSystemWatcher möglicherweise ein Ereignis verpasst, wenn die Puffergröße überschritten wird. Um das Verpassen von Ereignissen zu vermeiden, folgen Sie diesen Richtlinien...

    http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher.aspx

    Beste Gruesse
    brima



    • Bearbeitet brima Dienstag, 25. März 2014 09:40
    • Als Antwort markiert Alex Pitulice Dienstag, 1. April 2014 12:43
    Dienstag, 25. März 2014 09:38
  • Erstmal Danke für die Antworten!!!!

    So und nun gehts :-)

    Was bedeutet pipen?

    Ich wäre euch wirklich dankbar wenn mir einer kurz auf die Sprünge helfen könnte...

    Wie gesagt, bin noch am lernen....

    Das möglicherweiße ein Ereignis verpasst werden kann habe ich schon gelesen!

    Ich wäre euch dankbar, wenn mir einer einen kleinen Ansatz schicken kann, wie ich GENAU DIESE Dateien überwachen kann.

    Stehe auf dem Schlauch :-(

    MfG

    Dienstag, 25. März 2014 10:05
  • Hallo,

    lies dir das mal durch:

    get-help about_pipelines

    Beste Gruesse
    brima

    Dienstag, 25. März 2014 10:16
  • Am 25.03.2014 schrieb Mitsch86:

    Erstmal Danke für die Antworten!!!!



    So und nun gehts :-)

    Freut mich für dich und Danke für die Rückmeldung. ;)
    Zeig uns doch noch dein fertiges Script, dann haben spätere Leser auch
    was davon.

    Was bedeutet pipen?

    Ich wäre euch wirklich dankbar wenn mir einer kurz auf die Sprünge helfen könnte...

    Wie gesagt, bin noch am lernen....

    Du mußt lernen die Hilfe zu lesen. Und der Hersteller der SW, in
    diesem Fall MSFT sollte die erste Anlaufstelle sein. Im Technet ist
    sehr viel dazu zu finden.

    Ich wäre euch dankbar, wenn mir einer einen kleinen Ansatz schicken kann, wie ich GENAU DIESE Dateien überwachen kann.

    Ich persönlich würde mir eine EXE in Visual Studio 2010 erstellen,
    aber das ist Geschmackssache.


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Dienstag, 25. März 2014 10:25
  • Hallo,

    leider habe ich mich vorhin verschrieben...

    Ich wollte sagen und jetzt geht es los... :-) und nicht jetzt geht es!!!!   Sorry!

    Also die Hilfe habe ich mir durchgelesen und habe es per Pipes versucht, leider wieder ohne erfolg :-(

    Ich würde es trotzdem gerne irgendwie mit Powershell lösen, da ich mich hier weiterbilden möchte!

    Leider finde ich im Netz kein Beispiel, indem explizit 2 oder mehr Dateien zur Überwachung angegeben werden.

    Wäre wirklich nett wenn ihr mir nochmals helfen könntet!!!

    Dienstag, 25. März 2014 16:03
  • Was ich nun im Netz gelesen habe ist, dass ich mit einem filesystemwatcher nur einen Ordner (+Unterordner) überprüfen kann. Wenn ich es richtig verstanden habe, kann ich keine unabhängigen Ordner mit einem filesystemwatcher überprüfen. Ich muss diesen mehrfach aufrufen....

    Dann versuch ich mal mein Glück, für Hilfe bin ich immer noch zu haben :-)

    Dienstag, 25. März 2014 16:24
  • Hier der Code mit dem ich mehrere Dateien in Unterschiedlichen (keine Unterverzeichnisse) Ordnern überwachen kann!

    Ich bin für jede Verbesserung offen....

    cls
    Unregister-Event -SourceIdentifier *
    
    
    $global:testfile = @("C:\Patha\file1.txt","C:\Pathb\file2.txt")
    
    
    function global:out_Text($txt) { Write-Host (“{0}” -f $txt) }
    
    $OnCreate = { 
      $text = “Ereignis: [{0}] in {1} : {2:d}” –f    $eventArgs.ChangeType, 
        $eventArgs.FullPath, $Event.TimeGenerated.DateTime 
      out_Text ($text)
    }
    
    $OnChange = {
      $text = “Ereignis: [{0}] in {1} : {2:d}” –f    $eventArgs.ChangeType, 
        $eventArgs.FullPath, $Event.TimeGenerated.DateTime
      out_Text ($text)
    }
    
    $OnRename = {
      $text = “Ereignis: [{0}] in {1} : {2:d}” –f    $eventArgs.ChangeType, 
        $eventArgs.FullPath, $Event.TimeGenerated.DateTime
      out_Text ($text)
    }
    
    $OnDelete = {
      $text = “Ereignis: [{0}] in {1} : {2:d}” –f    $eventArgs.ChangeType, 
        $eventArgs.FullPath, $Event.TimeGenerated.DateTime
      out_Text ($text)
    }
    
    
    $cnt = 1
    
    foreach ($nameoftestfile in $testfile) 
    {  
    $path = (Split-Path $nameoftestfile)
    $filter = (Split-Path $nameoftestfile -leaf)
    $watchername = '$FSW' + $cnt
    $watchername = new-object system.io.filesystemwatcher 
    $watchername.Path = $path 
    $watchername.IncludeSubdirectories = $False  
    $watchername.Filter = $filter  
    $watchername.EnableRaisingEvents = $True
    #$watchername.NotifyFilter = "LastWrite" 
    Register-ObjectEvent -InputObject $watchername -EventName Created -Action $OnCreate | Out-Null
    Register-ObjectEvent -InputObject $watchername -EventName Changed -Action $OnChange | Out-Null
    Register-ObjectEvent -InputObject $watchername -EventName Renamed -Action $OnRename | Out-Null
    Register-ObjectEvent -InputObject $watchername -EventName Deleted -Action $OnDelete | Out-Null
    ++$cnt;
    }

    Dienstag, 25. März 2014 18:39
  • Ich schon wieder :-) Sorry fürs Nerven!!!

    Mit oben stehendem Code bekomm ich follgende Ausgabe:

    Wie ist es möglich, die Ereignisse die Gleichzeitig passieren, als ein Ereignis darzustellen.

    Ich würde gerne irgendwie alle Änderungen die in einem gewissen Zeitraum geschehen als eine deuten.

    Denn Inhalt aller Änderungen möchte ich trotzdem anzeigen, auch wenn sie gleichzeitig geschehen sind.

    Also in etwa so:

    Schonmal vielen Dank

    Mittwoch, 26. März 2014 05:49