bluestarbln
Goto Top

Powershell - Dateiüberwachung, bei ausbleibender Aktualisierung soll PC neu gestartet werden

Hallo zusammen,

in einem anderen Beitrag habe ich im Grunde genommen schon das gefunden, was ich suche:

Es soll eine dauerhafte Überwachung einer einzelnen Datei (aktuell.txt) stattfinden, welche minütlich aktualisiert wird. Sofern über einen Zeitraum von z.B. 120 Sekunden keine Aktualisierung registriert wurde, soll der PC neu gestartet werden.

Die Variablen des unter dem o. g. Beitrag aufgeführten Script habe ich entsprechend angepasst (siehe unten).

# Datei deren Inhalt überwacht werden soll
$file = 'C:\Wswin\aktuell.txt'  
# Max Zeit ohne Änderungen in Sekunden
$global:maxtime = 120
# ---------
# Zeit der letzten Änderung
$global:lastchange = get-date
# Eventuell existierenden Event subscriber löschen
Get-EventSubscriber FileChanged -EA SilentlyContinue | Unregister-Event -Force
# Filesystemwatcher erstellen
$fsw = New-Object IO.FileSystemWatcher (Split-Path $file -Parent), (Split-Path $file -Leaf) -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}   
# Filesystemwatcher registieren
Register-ObjectEvent $fsw Changed -SourceIdentifier FileChanged -Action {
    # Pfad zur Datei
    $fullpath = $Event.SourceEventArgs.FullPath
    $global:lastchange = $Event.TimeGenerated
} | out-null

cls
write-host "Überwache Datei '$file' ..." -F Green  
while($true){
    if ((get-date) -gt $global:lastchange.AddSeconds($global:maxtime)){
        write-host "Letzte Änderung an der Datei liegt länger als $global:maxtime Sekunden zurück." -F Yellow  
        # Tu hier was
        # z.B. Prozess neu starten oder Rechner neu starten
        Restart-Computer -Force
        break
    }
    sleep 1
}

Allerdings wird der PC jedes Mal neu gestartet, obwohl eine Änderung der aktuell.txt stattgefunden hat. Habe ich irgendetwas übersehen?

Über eure Hilfe wäre ich sehr dankbar.

Viele Grüße
Steven

Content-Key: 480382

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

Printed on: May 7, 2024 at 17:05 o'clock

Member: BirdyB
BirdyB Aug 01, 2019 at 18:02:14 (UTC)
Goto Top
Hi Steven,

warum nutzt du dort den Filesystemwatcher wenn du danach sowieso durch eine Endlosschleife läufst?
Da kannst du auch gleich jedes Mal die letzte Zugriffs, bzw. Schreibzeit abfragen...

Viele Grüße
Mitglied: 140447
Solution 140447 Aug 01, 2019 updated at 19:02:37 (UTC)
Goto Top
Der Filesystemwatcher feuert nur wenn das Handle die Änderungen auch flusht und nicht das File-Handle dauerhaft offen hat und das File nicht schließt, in dem Fall tritt kein Änderungsevent ein und es kommt zu dem Verhalten. In dem Fall wäre eine simple dauerhafte Schleife mit Änderungsdatum-Check sinnvoller, statt dem FS Watcher wenn dieser bei deiner Anwendung nicht feuert.
# Datei deren Inhalt überwacht werden soll
$file = 'C:\Wswin\aktuell.txt'  
# Max Zeit ohne Änderungen in Sekunden
$maxtime = 120
# ---------
cls
write-host "Überwache Datei '$file' ..." -F Green  
while($true){
    if ((get-date) -gt (Get-Item $file).LastWriteTime.AddSeconds($maxtime)){
        write-host "Letzte Änderung an der Datei liegt länger als $maxtime Sekunden zurück." -F Yellow  
        # Tu hier was
        # z.B. Prozess neu starten oder Rechner neu starten
        Restart-Computer -Force
        break
    }
    sleep 5
}
Member: bluestarbln
bluestarbln Aug 01, 2019 updated at 19:27:13 (UTC)
Goto Top
Gute Frage...

Meine Vermutung:

Das Script startet zusammen mit dem PC, wird da erstmalig aufgerufen und durchläuft dann permanent die Schleife. So muss man dafür nicht separat eine Aufgabe erstellen. Ich denke mal, dass das der Gedanke für diese anschließende Schleife war.

Ehrlich gesagt kenne ich mich mit Powershell so gut wie gar nicht aus und bin froh, wenn ich den einen oder anderen Grundbegriff weiß. Wie bereits erwähnt stammt das Script nicht von mir (würde sowas nicht mal ansatzweise hinbekommen mit meinen Kenntnissen und bin deshalb schon dankbar für das, was ich gefunden habe).

---

Edit:
Wow...vielen vielen lieben Dank, routerboard. Nun kann ich meine Nerven wieder etwas schonen, nachdem ich gestern und heute jeweils den ganzen Tag das Internet nach möglichen Lösungen durchforstet und mir den Kopf zermatert habe.

Danke nochmals für die superschnelle Hilfe und einen schönen Abend!
Mitglied: 140447
140447 Aug 01, 2019 updated at 19:36:04 (UTC)
Goto Top
Ich denke der FS Watcher im verlinkten Skript dient dazu Ressourcen und Pollings zu verringern, so muss die Schleife nicht bei jedem Durchgang eine Abfrage der Daten im Dateisystem machen und muss stattdessen nur die Variablen vergleichen. Denke das war die Intention. Das funktioniert auch gut solange eben eine Anwendung FS Watcher kompatibel arbeitet, in deinem speziellen Fall wohl offensichtlich nicht.

Ebenso schönen Abend.