Hallo zusammen,
nachdem sich WsWin gestern Abend bei mir wieder verabschiedet hat bin ich nun auf der Suche nach einer Lösung, damit so etwas nicht mehr vorkommt.
Zur Vorgeschichte:
Da es gelegentlich zu Ausfällen (Schnittstelle etc.) kam, habe ich hatte über Datei > Optionen den automatischen Programmneustart von WsWin eingestellt. Offensichtlich mag WsWin nicht, dass man via Remotedesktopverbindung auf den virtuellen Rechner (auf dem WsWin läuft) zugreift.
Das Programm machte nach dem Start mit dem Auslesen der Daten aus der Station erst weiter, nachdem ich heute Morgen (ebenfalls via Remoteverbindung) auf den PC zugegriffen habe. Dann lief wieder alles glatt.
Nun dachte ich mir: Wieso nicht die aktuell.txt im WsWin-Ordner via powershell überwachen und, sobald über einen gewissen Zeitraum keine Einträge mehr erfolgen, den ganzen PC neu starten.
Hierfür habe ich auch bei
Administrator.de ein Powershell-Script gefunden und entsprechend angepasst.
Hier das Original:
# Datei deren Inhalt überwacht werden soll
$file = 'D:\Daten\logfile.txt'
# Max Zeit ohne Änderungen in Sekunden
$global:maxtime = 1800
# ---------
# 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
}
Und hier der Code mit meinen Änderungen:
# 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
}
Mein Problem besteht nun darin, dass der Rechner neu gestartet wird, obwohl minütlich eine Änderung der aktuell.txt erfolgt. Hat jemand von euch eine Idee?
Achso! Wichtig ist mir, dass nicht überwacht wird, ob ein Programm läuft, sondern ob eine Änderung einer Datei stattfand und wenn nicht, dass dann der Rechner neu startet. Das Script ist somit genau das, was ich suche - funktioniert eben leider nicht so richtig.
Ich danke euch schonmal vorab.
Viele Grüße
Steven