Systemstartzeit auslesen und Meldung ausgeben, wenn Rechner gewisse Zeit läuft

  • VBScript

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Systemstartzeit auslesen und Meldung ausgeben, wenn Rechner gewisse Zeit läuft

    Hallo zusammen,
    ich bin ziemlich neu in der VBS-Welt unterwegs, würde aber gerne folgendes Problem lösen: Eine .vbs Datei soll die Hochfahrzeit des Rechners erfassen und mir dann nach z.B. 5 h eine Meldung ausgeben, dass der Rechner schon 5 h läuft. Ich habe mir die Struktur so gedacht:

    a = Zeit des Systemhochfahrens (HH:MM)
    b = aktuelle Systemzeit (HH:MM)

    do
    c = b-a
    loop while c < 05:00

    If c > "05:00" then
    x=msgbox("PC läuft schon 5 Stunden", 0+48, "Warnung")
    end if

    Das Script will ich in den Autostart Ordner packen, damit es automatisch im Hintergrund mitläuft.
    Mein Problem liegt darin, dass ich nicht weiß, wie ich die Startzeit bzw. die aktuelle Systemzeit auslesen kann und in welchem Format diese dann miteinander verrechnet werden können. Könnt ihr mir da weiterhelfen? Bin ich mit meinem Script auf dem Holzweg?
    Schon im Voraus vielen Dank für euren Input.
    Gruß anfänger
    1. Willkommen im Forum
    2. Die Google-Suche nach "system time vbs" führt zum Ziel. Zu naheliegend?

    Visual Basic-Quellcode

    1. StartTime = Time
    2. Do Until DateDiff("h", StartTime, Time) = 5
    3. Loop
    4. MsgBox "Das Script läuft seit 5 Stunden"

    Aber genauso gut könntest Du Dir ausrechnen, wieviele Millisekunden der Zeitraum hat und es mit WScript.Sleep DauerInMillisekunden probieren.
    3. Bitte CodeTags verwenden.
    4. Wozu die If-Geschichte? Wenn die Schleife verlassen wird, sind doch eh 5 Stunden rum.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo zusammen,
    obwohl das Script von VaporiZed wunderbar funktioniert, bin ich auf ein Problem gestoßen. Wenn ich den Rechner wegen eines Problems Neustarten muss, läuft die DateDiff-Funktion ja wieder mit der neuen Startzeit los.

    Meine Überlegung war, die Variable "Starttime" immer mit der ersten Systemstartzeit nach 12 am (Mitternacht) zu beschreiben. Diese Variable müsste ja dann aber trotz Neustart immer noch zu Verfügung stehen. Geht sowas überhaupt? Könntest ihr mir nochmal helfen?
    Setz noch ein R dran und Du hast einen weiteren Schritt zur Lösung.
    Time gibt die aktuelle Uhrzeit an. Timer die Sekunden nach Mitternacht. Reicht Dir das als Starthilfe?
    btw: hier eine kleine VBS-Referenz
    Allerdings sehe ich jetzt nicht mehr ganz den Sinn darin.

    anfänger2018 schrieb:

    Eine .vbs Datei soll die Hochfahrzeit des Rechners erfassen und mir dann nach z.B. 5 h eine Meldung ausgeben, dass der Rechner schon 5 h läuft.

    Nach einem Neustart sollte nach der Aussage die 5-Stunden-Zeit doch wieder von vorn beginnen. Oder überblicke ich das Gesamtproblem nicht?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Sorry ich habe deine Antwort gar nicht zuende gelesen. Es ist so, dass ich ein Script brächte, dass mich an einen Arbeitstag daran erinnert, dass ich schon x-Stunden am Rechner sitze. Jetzt ist es nur so, dass bei einem Neustart die bspw. 5h Stunden wieder von vorne los gehen, obwohl ich davor schon am Rechner gearbeitet habe. Versteht du was ich meine?
    ---
    An die Timer Fkt. habe ich auch schon gedacht. So bin ich ja auf die Variablenüberschreibung um 12 am gekommen :)
    Mir fehlt nur der Ansatz, wie ich immer die Referenz zum ersten Systemstart des Tages finde. Ich werde mir mal die Funktionen in deinem Link anschauen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „anfänger2018“ ()

    Uiuiui. Der erste Systemstart des Tages. Entweder speicherst Du diese Zeit in einer Datei ab und holst die immer hervor oder Du wühlst Dich durch die Windows-Ereignisprotokolle. Der erste Vorschlag dürfte etwas leichter sein. Aber ist nicht grad manipulationssicher - falls relevant.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Manipulationssicher muss es nicht sein. Soll praktisch nur ein "Reminder" für mich sein, dass ich nicht zu lange vor dem Rechner sitze. Das Problem ist, dass ich leider sehr wenig "Programmierahnung" habe.
    Der erste Systemstart des Tages in eine Datei speichern, hört sich logisch an, ich habe nur keine Ahnung wie ich das umsetzten soll und wie ich dann auf diese Variable zugreifen kann, wenn sie nicht im Programmcode drin steckt.
    ---
    Hättest du evtl. ein Vorschlag wie ich starten kann? Leider sehe ich einige Hürden, die ich mit mein jetzten Kenntnisstand nicht zu lösen vermag:
    - Variable in Datei speichert
    - Diese Variable im Script aufrufen
    - Ich bräuchte ja irgendeine Regel, dass die zweite Systemstartzeit des Tages die Variable nicht überschreibt, jedoch die erste Systemstartzeit des Folgetages (nach Mitternacht) die Datei wieder überschreibt. Da bin ich schon wieder völig überfordert. Und ich weißt, dass jeder Programmierexperte die Hände über dem Kopf zusammen schlägt, wenn er solche lächerlichen Probleme sieht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „anfänger2018“ ()

    Jetzt mal ganz entspannt. Man fängt ja auch nicht mit dem Aerosolbombenbau an, sondern beschäftigt sich erstmal mit Silvesterknallern.
    Hier ein Thread, bei dessen erster Antwort das Lesen und Schreiben in einer Datei aufgezeigt wird.
    Zuerst schaust Du mittels Code, ob die Speicherdatei für den alten Wert schon exisitert. Alternativ legst Du die Datei per Hand an und schreibst einen Wert rein, z.B. 24.01.2018 07:00:00. Dann liest Du den Inhalt, nämlich diese eine Zeile in Dein Script in eine Variable, z.B. namens OldDateTime ein, gibst diese Variable zusammen mit Now in die DateDiff-Funktion DateDiff("d", OldDateTime, Now) und erhältst so durch den Parameter "d" die Differenz an Tagen zwischen dem abgespeicherten Wert und Jetzt. Daraufhin kannst Du unterscheiden, ob der Wert in der Datei überschrieben werden soll oder nicht und entsprechend reagieren. Klar soweit?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo VaporiZed,
    vielen Dank für deine Rückmeldung. Ich habe mal folgendes Script geschrieben. Ich komm mit der Auslesefunktion leider nicht klar. Zum Verständnis: Die Datei OldStartInfo.txt existiert schon, bevor das Script gestartet wird.
    Habe bisher folgenden Code:

    'Definieren der aktuellen Startinformationen
    NewStartTime = time
    NewStartDate = date

    'Auslesen der alten Startinformationen aus Datei
    OldStartTime = zeile1 aus OldStartInfo.txt
    OldStartDate = zeile2 aus OldStartInfo.txt


    a = DateDiff("d", OldStartDate, NewStartDate)

    If a > 0 then
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set MyFile = FSO.CreateTextFile("C:\OldStartInfo.txt ", TRUE)
    MyFile.Close
    Set MyFile = FSO.OpenTextFile("C:\OldStartInfo.txt", 8)
    MyFile.WriteLine (NewStartTime)
    MyFile.WriteLine (NewStartDate)
    MyFile.WriteLine ("Erste Systemstartzeit des Tages")
    MyFile.Close
    End if

    RelevantTime = zeile1 aus OldStartInfo.txt

    Do Until DateDiff("n", RelevantTime, Time) = 100
    Loop
    x=msgbox("Achtung: PC wurde zum ersten mal vor 100 min gestartet", 0+48, "Warnung")

    Könntest du mir bitte bei Auslesen der Variablen weiterhelfen? Geht das ansonsten so oder bin ich auf dem Holzweg?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „anfänger2018“ ()

    Rot ist als Textfarbe den Moderatoren vorbehalten. Bitte ändern, bevor es einen Rüffel von denen gibt.
    Wie im angegebenen Thread hinterlegt, liest Du mit

    Visual Basic-Quellcode

    1. Set objFile = objFS.OpenTextFile(strFile)
    2. OldTime = objFile.ReadLine
    3. OldDate = objFile.ReadLine
    die Daten aus. Brauchst Du noch mehr Info? Klang nicht so.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo,
    vielen Dank für den Input. Habe jetzt ein Script, dass macht was es soll. Jedoch habe ich das Problem, dass dieses Script ca. 40 % PCU auslastung erzeugt. Ich habe die "rechenintensiven" Zeilen herausgefischt:

    'Erste Startzeit als Referenzwert auslesen
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTextFile = objFSO.OpenTextFile("C:\Users\Public\Warnsystem\OldStartInfo.txt")
    RelevantTime = objTextFile.ReadLine
    objTextFile.Close

    Do Until DateDiff("n", RelevantTime, Time) > 100
    Loop
    x = msgbox("Achtung: PC-Startzeit: " & RelevantTime & " Uhr", 0+48, "Warnsystem")

    Könnt ihr mir sagen, warum das so rechenintensiv ist? Was habe ich falsch gemacht?
    Die Krux liegt bei der Do-Loop. Die suggeriert den CPUs: "Hier! Ganz wichtig! Unbedingt abarbeiten!". Bei mir werden da mal 38% CPU-Auslastung erreicht. Daher - wie relativ früh im Thread erwähnt:

    Visual Basic-Quellcode

    1. WScript.Sleep 10000
    um 10 Sekunden (10000 Millisekunden) zu warten, statt mit ner Do-Loop zu arbeiten. Da ist die Auslastung bei mir < 1%. Und das Berechnen geht dann auch über die gespeicherten Werten. Musst nur das Script etwas umgestalten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    WScript.Sleep X wartet X Millisekunden, bis das Programm fortgesetzt wird. Eben fast so wie die Do-Loop. Nur mit dem Unterschied, dass die Do-Loop einen Großteil der CPU-Ressourcen frisst. Und WScript.Sleep nicht. Du musst Dir nur ausrechnen (lassen), wieviele Millisekunden es sind, bis die MsgBox angezeigt wird. Fast so, wie bei der Do-Loop. Nur etwas anders, da Du bei den vorhergehenden Versuchen über DateDiff mit beliebigen Zeitintervallen arbeiten konntest, hier aber auf Millisekunden beschränkt bist. Aber ist ja keine große Umrechnung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Joa, auch ne Möglichkeit. Oder eben nochmals anders erklärt:
    Mit

    Visual Basic-Quellcode

    1. NewStartTime = time
    2. NewStartDate = date
    3. Set objFSO = CreateObject("Scripting.FileSystemObject")
    4. Set objTextFile = objFSO.OpenTextFile("C:\Users\Public\Warnsystem\OldStartInfo.txt")
    5. RelevantTime = objTextFile.ReadLine
    6. objTextFile.Close

    packst Du die aktuelle Zeit und die alte Zeit aus der Datei in Variablen.
    Aktuelle_Zeit - Alte_Zeit = Zeitdifferenz in Tagen zwischen Jetzt und dem 1. Systemstart des Tages
    Zeitdifferenz in Tagen * 86400 (Sekunden pro Tag) = Zeitdifferenz in Sekunden
    Zeitdifferenz in Tagen * 86400000 (Millisekunden pro Tag) = Zeitdifferenz in Millisekunden (kurz ZDiM)
    Und dann eben soll bis 5 Stunden nach dem 1. Systemstart gewartet werden. 5 Stunden = 300 Minuten = 18000 Sekunden = 18000000 Millisekunden; davon sind ZDiM Millisekunden schon vergangen. Also sagt Du im Scipt: "Warte 18000000 - ZDiM". Und wenn die Wartezeit abgelaufen ist, sind seit dem 1. Systemstart des Tages so ziemlich genau 5 Stunden vergangen. Einfache Mathematik (ich hoffe, dass ich mich nicht verrechnet habe :whistling: )
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.